C++中静态内存中的数组大小能在运行时更改吗?为什么?

3
我已经阅读了这段文字: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;

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


8
此代码使用了称为“可变长度数组”的gcc扩展功能,它不属于标准C++。 - pmr
除了@pmr所说的之外 - 据我所知,它是为了c99兼容性而添加到编译器中的(c99支持VLA) - amit
@amit:首先是C99,而不是C98,其次FYI VLAs自C11以来是可选的。 - Yakov Galka
是的,当然我是指C99,脑子一抽 :| 谢谢。 - amit
请注意,只要您不将数组传递给函数,cout<<sizeof(myArray)/sizeof(myArray[0])<<endl;就会给出一个很好的结果,然后sizeof(myArray)将返回指针的大小。 - Maroun
你声明的数组不在静态内存中,而是在自动内存中(即在堆栈上)。 - Sergey Kalinichenko
2个回答

5

您所发布的代码不符合C++标准。虽然在C语言中,变长数组很受欢迎,但C++编译器实现者可能认为将此功能也可用于C++是个好主意。但按照C语言的方式去实现它并不是一个好主意,目前已经讨论了一些变种来纳入C++。

看起来,gcc和clang接受上述代码(添加必要的包含、函数等后),clang甚至没有警告。


+1 哈哈,当 g++ 接受它时,没有什么奇怪的。dang 似乎只是 g++ 的克隆(除了 dang 在 Windows 上仍然无法实现适当的异常处理)。 - Cheers and hth. - Alf
@Cheersandhth.-Alf,Clang 与 GCC 的兼容性非常高,这使得它非常受欢迎,因为在移植方面几乎没有任何开销。 - pmr

5

如我在评论中指出的那样,但这里要更详细地说明。

在标准C++中,数组的大小必须在编译时知道。在您的示例中并非如此。您的代码可以编译,因为您(可能)启用了带有可变长度数组扩展功能的gcc。

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


是的,这是真的。它在 Visual C++ 2013 上不起作用。 - Nidhin David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接