如果我在函数中有以下代码,我将不会收到错误,并且我可以编译没有问题,但是,一旦我将它放在全局范围内,我将收到“无法分配大小为零的数组”的错误,以及其他几个错误。为什么会发生这种情况,如何摆脱错误。我知道全局变量的风险,这只是一个简单的测试用例。
int* intest[2];
intest[0] = new int;
答案 0 :(得分:1)
您可以在全局范围内声明,但不允许使用new运算符或赋值。因此,您需要在全局范围内声明int * intest [2](并且您的所有代码都会看到它),但C ++要求new在主代码的序列中。 (可能是应用程序的某种启动功能)。
编辑:正如@phresnel所指出的,你可以在这个范围内使用new运算符但不能使用赋值(这是不寻常的但不是非法的)。但是,以下用作启动的新运算符将适用于您:int *x[2]={new int,new int};
一般情况下,强烈建议不要使用这样的全局缓冲区,并将其视为反模式 - 如果您可以避免使用它,则可能应该这样做。
答案 1 :(得分:1)
int* intest[2];
但是有效的放置在本地范围内:
intest[0] = new int;
不是。
不同之处在于,上面一个是初始化语句(创建变量),下面一个是执行代码段。
应该“执行”的代码不能在全局范围内调用,例如,您无法在全局范围内调用函数。该函数何时被调用?
我可以在全局范围内创建我想要的变量数量但是我不能从中运行代码,除了在初始化全局变量时调用构造函数。
如果您想执行以下代码:
intest[0] = new int;
您必须通过主要或其他功能执行它,否则程序将不知道何时执行。
答案 2 :(得分:0)
AFAIK,全球范围只允许您放置define
和declaration
。而intest[0] = new int;
是c / c ++编译器在编译时失败的赋值。