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;

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

4

2 回答 2

5

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

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

于 2012-11-24T21:00:06.157 回答
5

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

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

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

于 2012-11-24T21:01:37.420 回答