数组大小和常量

9

在C++中

可能是重复问题:
从另一个数组值初始化数组大小

const int a[]={1,2,3,4,5}; 
int b[a[2]]; 

int main()
{
    return 0;
} 

代码在第二行出现错误; 但是,如果像下面这样,编译后不会出现错误:
const int a=3; 
int b[a]; 

int main()
{
    return 0;
} 

为什么会这样呢?然而如果我在main函数中定义数组b,在两种情况下都可以正确运行...

选择你的代码,然后点击代码窗口顶部的花括号按钮以正确格式化它。还要注意,在问题表单下方有一个预览,所以在发布之前可以看到你的问题是否可读。 - Anon.
@Anon 谢谢,我下次会注意的。 - algo-geeks
1
这个问题最近几乎完全相同地被问过。 - GManNickG
如果您提供问题的链接会更有帮助。 - Betamoo
@Beta: 如果我知道的话,我会这么做。我的意思是说,如果有人愿意,他们可以去搜索一下。我正在试探性地寻找。 - GManNickG
2个回答

5

因为在C++中,数组的大小必须是常量表达式,而不仅仅是常量数据。即使是const的数组数据也不是常量表达式。

第二个版本是常量表达式。


你可以告诉提问者如何创建一个动态数组(使用可变大小的变量)... - Betamoo
如果我在主函数内定义数组b,那么就不会出现任何错误。请解释一下... - algo-geeks
即使您将其“定义在main函数内部”,这仍然是一个错误。如果您的编译器没有报告错误,则必须是编译器实现的非标准语言扩展。也就是说,您的编译器支持具有非常数大小的本地数组。尽管如此,C++甚至不允许这种情况发生在本地数组中。 - AnT stands with Russia
1
为什么第一个是常量数据而不是常量表达式,如果它的值在编译时和运行时都保持不变? - algo-geeks
@algo-geeks:参见这个问题的答案——在C++11中,您可以使用“constexpr”来使编译器接受a [2]确实是一个常量表达式。 - ShreevatsaR

4

看起来你想创建一个可变大小的数组。为此,必须使用指针。

指针

通常情况下,你会像这样声明一个数组:

char a[4];

一个数组必须是具有恒定大小的。它不能改变。我们如何使大小成为可变的呢?像这样。

char* a = new char[length];

这段代码的作用是什么?通常情况下,当你声明一个特定大小的数组时,它会在堆栈上声明。然而,这段代码所做的是在堆上分配内存。

char a[4]; // This is created at compile time
char* a = new char[length]; // This is created at run time

你可以创建一个指向地址的指针,从而可以在安全的内存空间中声明和赋值数组。

不,我们应该使用std::vector而不是容易出错的手动内存管理。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接