静态类型化和动态类型化在堆栈溢出(例如 )上被反复询问。
协商一致意见似乎是(引用上述链接的最高答复):
如果在编译时知道变量的类型,则会静态地输入语言。
一种动态的语言:
如果类型与运行时值相关联,而不是命名变量/字段/等,则该语言是动态键入的。
Perl似乎是静态类型的(或其他静态/动态类型的常见定义)。它有3种类型:标量、数组、散列(为了简单起见忽略引用之类的东西)。类型与变量一起声明:
my $x = 10; # declares a scalar variable named x
my @y = (1, 2, 3);
这个问题听起来可能有点奇怪,但我从来没有完全理解为什么我们需要有两种不同的语法来删除C++中的动态分配内存?
例如,
int *p = new int[10];
delete[] p; // why not just delete p;?
在普通的老C中,您只需使用free函数来释放分配给指针的内存,而不管分配的元素数量如何。当然,C++要复杂一些,因为它允许类类型调用它们的析构函数等等。但是,我认为使用单一语法删除C++中动态分配的内存没有任何障碍。
有什么根本原因决定使用两个版本,delete和delete[]?
更重要的是,如果您使用delete而不是delete[],大多数编译器甚至都
下面是等子集问题。
我的目标不仅是获得布尔值结果,表明解决方案是否可行(如上面的链接中所示),还可以找到相关的子集。
下面是 (使用Ideone),它使用一个数组,它的大小对于C++是动态的,但是当我将它转换为时,我的挑战是使用正确的数据结构,因为int[]和List<int>都不能达到相同的目的,就像在C# solution Main中可以看到的那样,我取数组大小的值,只填充n-2索引,但将n-1索引保留为默认0,否则会导致index out of range exception。
有谁能建议一个更好的数据结构,使其与C++程序相似且灵活?
可能重复:
这是常量大小为4的简单数组的定义,它存储在堆栈内存中:
int array[4];
现在,如果我想在堆栈中声明动态大小的数组,似乎应该编写以下代码:
int n;
cin >> n;
int array[n];
但是,正如我们所知道的,这在C++中是不允许的,我们可以编写这个,它将在动态内存(即堆)中创建数组:
int n;
cin >> n;
int *array = new int[n];
但是这要慢得多,而且(因为使用了新的运算符),需要在我们完成数组的工作之后调用delete []操作符。
所以我的问题是:
为什么C++不允许在堆栈内存中创建动
因此,在像C这样的语言中,内存被分成5个不同的部分:操作系统内核、文本段、静态内存、动态内存和堆栈。如下所示:
如果我们在C中声明了一个静态数组,你必须事先指定它的大小,之后它将永远是固定的。程序将为数组分配足够的内存,并按预期将其放在静态数据段中。
然而,我注意到在Java中,你可以这样做:
public class Test {
static int[] a = new int[1];
public static void main( String[] args ) {
a = new int[2];
我以为我理解VLA是什么,直到我在这里看到一个关于动态内存分配与可变长度数组之间的区别的问题。因此,我在动态内存分配方面没有任何问题,至少目前是这样,但我不理解的是,为什么这段代码被认为是VLA:
int size = 10; // or whatever
int my_array [size] ; // why this is a VLA
更神秘的是,这甚至被认为是VLA。
const int size = 10;
int my_array [size]; // why even when i use a const it is a VLA .
所以,我的问题是,这两种不同的方法是如何被认
我已经写了一段时间的代码了,但是C++对我来说还是个新手。
我知道C++中有静态数组和动态数组。静态数组在编译时被分配内存,在堆中的运行时被分配动态内存。动态数组声明为:
data-type * variable = new data-type[value];
例如:-
int*a = new int[n];
和静态数组声明:
int a[n]; //where n already has value during the compilation time.
所以,我的问题是-
#include <iostream>
using namespace std;
int mai