声明一个动态大小的数组

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'作为数组绑定如果它的值直到运行时才知道

以上是关于声明一个动态大小的数组的主要内容,如果未能解决你的问题,请参考以下文章

delphi数组之菜鸟篇

IDL中如何定义 动态数组?

Java的数组和ArrayList

动态初始化的数组大小示例

动态声明数组和指针

泛型动态数组