所以这似乎是一个得到广泛回答的问题,但我更感兴趣的是两者之间到底发生了什么不同的内部结构。
除了第二个示例不仅创建了内存,还创建了指向内存的指针这一事实,当发生以下情况时内存会发生什么:
char a[5];
char b* = new char[5];
与为什么我问这个问题更直接相关,我怎么能做
const int len = 5;
char* c = new char[len];
但不是
const int len = 5;
char d[len]; // Compiler error
EDIT 应该提到我在 VC++ 上遇到了这个编译器错误(去计算...)
1>.\input.cpp(138) : error C2057: expected constant expression
1>.\input.cpp(138) : error C2466: cannot allocate an array of constant size 0
1>.\input.cpp(138) : error C2133: 'd' : unknown size
编辑 2:应该发布我正在使用的确切代码。当使用运行时值计算动态分配数组的常量长度时会产生此错误。
假设 random(a,b)
返回 a
和 b
之间的 int
,
const int len1 = random(1,5);
char a[len1]; // Errors, since the value
// is not known at compile time (thanks to answers)
鉴于
const int len2 = 5;
char b[len2]; // Compiles just fine
最佳答案
区别在于数组的生命周期。如果你写:
char a[5];
那么这个数组有它定义的 block 的生命周期(如果它是 在 block 范围内定义),包含它的类对象(如果它是 在类作用域中定义)或静态生命周期(如果它在命名空间中定义 范围)。如果你写:
char* b = new char[5];
,那么这个数组有你想给它的任何生命周期——你必须 显式终止其生命周期:
delete [] b;
关于您的最后一个问题:
int const len = 5;
char d[len];
是完全合法的,应该编译。不同之处:
int len = 5; // _not_ const
char d[len]; // illegal
char* e = new char[len]; // legal
造成差异的原因主要是编译器技术和 历史:在很早的时候,编译器必须知道 为了将数组创建为局部变量。
关于c++ - 使用常量长度时 char[] 和 new char[] 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226680/