0

如果我在函数中有以下代码,我将不会收到错误并且我可以编译没有问题,但是,一旦我将它放在全局范围内,我将收到“无法分配大小为零的数组”的错误,以及其他几个错误。为什么会发生这种情况,我怎样才能摆脱错误。我知道全局变量的风险,这只是一个简单的测试用例。

int* intest[2];
intest[0] = new int;
4

3 回答 3

1

允许在全局范围内声明,但不允许使用 new 运算符或赋值。因此,您需要在全局范围内声明 int *intest[2] (并且您的所有代码都会看到它),但 C++ 要求 new 在您的主代码的序列中。(可能在应用程序的某种启动功能中)。

编辑:正如@phresnel 所指出的,您可以在此范围内使用 new 运算符,但不能使用赋值(这是不寻常的但不是非法的)。但是,以下用作启动的新运算符将适用于您:

int *x[2]={new int,new int};

一般来说,强烈建议不要使用这样的全局缓冲区,并且被认为是一种反模式——如果你可以避免使用它,你可能应该这样做。

于 2012-04-18T07:58:49.903 回答
1
int* intest[2];

但是在本地范围内是有效的:

intest[0] = new int;

不是。

不同之处在于上面的一个是初始化语句(创建变量),而下面的一个是执行的代码段。

应该“执行”的代码不能在全局范围内调用,例如你不能在全局范围内调用函数。什么时候调用该函数?

我可以在全局范围内创建我想要的变量数量,但我无法从中运行代码,除非在初始化全局变量时调用构造函数。

如果要执行以下代码:

intest[0] = new int;

您必须通过 main 或其他函数执行它,否则程序将不知道何时执行它。

于 2012-04-18T08:27:31.717 回答
0

AFAIK,全球范围只允许你把definedeclaration放在上面。而intest[0] = new int;c/c++ 编译器在编译时将失败的赋值。

于 2012-04-18T08:06:26.623 回答