如果我想在main函数中声明一个动态大小数组,我可以这样做: -
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]
答案 0 :(得分:2)
例如:
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)。例如:
答案 1 :(得分:1)
回答你的问题:
1)问:为什么编译器必须知道上面代码中arr的大小?
答:如果你生成汇编输出,你会注意到一个固定值的“减去”,以便在堆栈上分配你的数组
2)问:我可以在函数内定义int arr [m] i ...
答:当然可以。当退出函数时,它将变为无效;)
基本上,你不需要“数组”。 C ++“vector”将是一个很好的选择:
std::vector<A> v(5, A(2));
以下是您可能喜欢的几个链接: