声明一个动态大小的数组
Posted
技术标签:
【中文标题】声明一个动态大小的数组【英文标题】:declaring an dynamic size array 【发布时间】:2012-09-09 05:10:22 【问题描述】:如果我想在主函数中,我可以这样做:-
int m;
cin>>m;
int *arr= new int[m];
以下不能做,因为编译时编译器必须知道每个符号的大小,除非它是外部符号:-
int m;
cin>>m;
int arr[m];
我的问题是:
为什么编译器必须知道上述代码中 arr 的大小?它是一个未在符号表中定义的局部符号。在运行时,堆栈会处理它(与 m 相同)。是不是因为编译器必须确定 main()(一个全局符号)的大小等于其中定义的所有对象的大小?
如果我有一个函数:
int func(int m)
我可以在函数内部定义 int arr[m] 还是我必须这样做
int *a= new int[m]
【问题讨论】:
一些编译器会让你编译第二个作为扩展。可变长度数组实际上是在 C99 中。 【参考方案1】:例如:
int MyArray[5]; // correct
或
const int ARRAY_SIZE = 6;
int MyArray[ARRAY_SIZE]; // correct
但是
int ArraySize = 5;
int MyArray[ArraySize]; // incorrect
这也是C++ Programming Language, by Bjarne Stroustrup 中解释的内容:
数组元素的数量,数组绑定,必须是一个常量表达式(§C.5)。如果您需要变量界限,请使用向量(第 3.7.1 节、第 16.3 节)。例如:
【讨论】:
您的链接不会指向除主页之外的任何内容。 @Rapptz 你期待什么?指向非法副本的链接? 通过所有这些链接讨论,我发现值得指出的是,该站点现在位于 stroustrup.com。 @Rapptz,请不要摆弄勺子。探索 @oldrinb 没有?他链接到一个网站,该网站有一个(大概)以前的工作目录,但现在没有。【参考方案2】:回答您的问题:
1) 问:为什么编译器必须知道上面代码中arr的大小?
答:如果您生成汇编输出,您会注意到某个固定值的“减法”以在堆栈上分配您的数组
2) 问:我可以在函数内部定义 int arr[m] i ... 吗?
A:当然可以。当你退出函数的那一刻,它就会变成无效 ;)
基本上,您不需要“数组”。 C++“向量”将是一个不错的选择:
std::vector<A> v(5, A(2));
这里有几个你可能会喜欢的链接:
http://www.parashift.com/c++-faq/arrays-are-evil.html
http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx
【讨论】:
@paulsm4...关于您的第二个答案...如果数组绑定必须是常量表达式的规则,编译器如何允许'm'作为数组绑定如果它的值直到运行时才知道以上是关于声明一个动态大小的数组的主要内容,如果未能解决你的问题,请参考以下文章