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