声明一个动态大小的数组

时间:2012-09-09 05:10:22

标签: c++ arrays compiler-construction

如果我想在main函数中声明一个动态大小数组,我可以这样做: -

 int m;
 cin>>m;
 int *arr= new int[m];

无法完成以下操作,因为编译编译器时必须知道每个符号的大小,除非它是外部符号: -

 int m;
 cin>>m;
 int arr[m];

我的问题是:

  1. 为什么编译器必须知道上面代码中arr的大小?它是一个未在符号表中定义的本地符号。在运行时,堆栈会处理它(与m相同)。是因为编译器必须确定main()(全局符号)的大小,该大小等于其中定义的所有对象的大小?

  2. 如果我有一个功能:

    int func(int m)
    

    我可以在函数中定义int arr [m],还是我必须做

    int *a= new int[m]
    

2 个答案:

答案 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));

以下是您可能喜欢的几个链接: