这个正确吗? 使用g++(3.4)编译成功。
int main() { int x = 12; char pz[x]; }
这个正确吗? 使用g++(3.4)编译成功。
int main() { int x = 12; char pz[x]; }
以下是所有其他答案的综合回答:
您现在的代码不是标准的C ++。它是标准的C99。这是因为C99允许您以这种方式动态声明数组。为了澄清,这也是标准的C99:
#include <stdio.h>
int main()
{
int x = 0;
scanf("%d", &x);
char pz[x];
}
这不属于任何标准:
#include <iostream>
int main()
{
int x = 0;
std::cin >> x;
char pz[x];
}
它不能成为标准的C++代码,因为那需要数组大小的常数,而且也不能是标准C代码,因为C语言没有 std::cin
(或命名空间、类等)。
要使其成为标准C++代码,请按照以下方法操作:
int main()
{
const int x = 12; // x is 12 now and forever...
char pz[x]; // ...therefore it can be used here
}
如果你想要一个动态数组,你可以这样做:
#include <iostream>
int main()
{
int x = 0;
std::cin >> x;
char *pz = new char[x];
delete [] pz;
}
但你应该这样做:
#include <iostream>
#include <vector>
int main()
{
int x = 0;
std::cin >> x;
std::vector<char> pz(x);
}
G++支持C99的动态数组特性,但这不是标准C++。G++有一个-ansi
选项,可以关闭一些不在C++中的功能,但这不包括此功能。要使G++拒绝该代码,请使用-pedantic
选项:
$ g++ -pedantic junk.cpp junk.cpp: 在函数‘int main()’中: junk.cpp:4: 错误:ISO C++禁止变量大小的数组‘pz’
从技术上讲,这不是C ++的一部分。您可以在C99(ISO / IEC 9899:1999)中使用可变长度数组,但它们不是C ++的一部分。正如您发现的那样,一些编译器支持它们作为扩展。
如果你想要在栈上创建一个动态数组:
void dynArray(int x)
{
int *array = (int *)alloca(sizeof(*array)*x);
// blah blah blah..
}
在堆栈上分配可变长度的数组是一个好主意,因为它快速且不会导致内存碎片。但是,不幸的是,C++标准不支持这样做。您可以通过使用模板包装器来使用alloca
函数实现这一点。但是,使用alloca
并不真正符合标准。
标准方法是使用自定义分配器的std::vector,如果您想避免内存碎片并加速内存分配,请参考boost::pool_alloc以获取快速分配器的良好示例。