3

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

 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]
    
4

2 回答 2

2

例如 :

int MyArray[5]; // correct

或者

const int ARRAY_SIZE = 6;
int MyArray[ARRAY_SIZE]; // correct

int ArraySize = 5;
int MyArray[ArraySize]; // incorrect

这也是Bjarne Stroustrup 在 The C++ Programming Language中解释的内容:

数组元素的数量,数组绑定,必须是一个常量表达式(§C.5)。如果您需要变量界限,请使用向量(第 3.7.1 节、第 16.3 节)。例如:

于 2012-09-09T05:15:29.647 回答
1

要回答您的问题:

1) 问:为什么编译器必须知道上面代码中 arr 的大小?

答:如果您生成汇编输出,您会注意到某个固定值的“减法”以在堆栈上分配您的数组

2) 问:我可以在函数内部定义 int arr[m] i ... 吗?

答:当然可以。并且在您退出该功能的那一刻将变得无效;)

基本上,你不想要一个“数组”。C ++“向量”将是一个不错的选择:

std::vector<A> v(5, A(2));

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

于 2012-09-09T05:33:28.640 回答