在C++运行时,可以在静态内存中更改数组的大小吗?怎么会?

Kor*_*gay 3 c++ arrays dynamic-memory-allocation

我从这里读到了这段话:http://www.cplusplus.com/doc/tutorial/dynamic/

您可能想知道声明正常数组和为指针分配动态内存之间的区别,正如我们刚刚所做的那样.最重要的区别是数组的大小必须是一个常量值,它将其大小限制为我们在设计程序之前决定的时间,在执行之前,而动态内存分配允许我们在使用任何变量或常量值作为其大小执行程序(运行时).

但是这个我的代码工作得很好:

int number;
cin>>number;
int myArray[number];

cout<<sizeof(myArray)/sizeof(myArray[0])<<endl;
cout<<sizeof(myArray)<<endl;
Run Code Online (Sandbox Code Playgroud)

这是否意味着数组是在动态内存中创建的?或者它是在静态内存中创建的,但它的大小仍然在运行时确定?

Die*_*ühl 5

您发布的代码不符合C++标准.由于可变长度数组在C中很流行,因此C++编译器实现者可能已经决定在C++中使用此功能也是一个好主意.这样做肯定不是一个好主意,因为它是在C中完成的,但正在讨论包含在C++中的一些变体.

看来,gcc和clang接受上面的代码(在添加必要的包含,函数等之后).clang甚至没有警告就这样做了.


pmr*_*pmr 5

正如我在评论中指出的那样,但这里有更多详细信息。

在标准C ++中,必须在编译时知道数组的大小。在您的示例中,情况并非如此。代码被编译是因为(大概)您在variable length array启用扩展名的情况下使用gcc 。

正确设置警告级别将阻止编译此代码。