2012-04-18 35 views
0

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

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

回答

1

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

编辑:正如@phresnel指出的,你可以在这个范围内使用新的操作符,但不能赋值(这是不常见的,但不是非法的)。但是作为启动会为你工作了以下新的运营商:

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

一般使用这样的全球性缓冲的强烈劝阻,被认为是一个反模式 - 如果你能避免使用它,你可能应该。

+0

这很奇怪,为什么我不能在全局变量上使用新的或赋值? – judeclarke 2012-04-18 08:03:21

+1

@judeclarke:这只是为了保持一点理智。如果您可以将常规语句放在命名空间范围中,那么考虑单独编译,它们将按照什么顺序执行?这就是初始化的问题,称为“全局初始化失败”。因为你*可以*放置有任何效果的表达式,因为初始化器......这与C++缺乏适当的模块有关。 – 2012-04-18 08:09:25

+1

-1:当然你可以在全局范围内使用'new'和赋值。例如:'int * x,* y = x = new int; int main(){} – 2012-04-18 08:20:02

0

AFAIK,全球范围只允许你把definedeclaration就可以了。然而intest[0] = new int;是编译时c/C++编译器会失败的一项任务。

+0

为什么这不被允许? – judeclarke 2012-04-18 08:09:00

+0

这是C/C++规则。 c/C++不是从第一行代码执行到最后一行代码的脚本语言,但是每个执行代码都应该停留在方法中,并从方法** main **开始。 – Sylvester 2012-04-30 09:36:31

1
int* intest[2]; 

却在局部范围内有效配售:

intest[0] = new int; 

不是。

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

代码应该是“执行”不能在全局范围内调用,例如,你不能在全局范围内调用一个函数。何时会调用该功能?

我可以在全局范围内创建多少个变量,但是我不能从初始化全局变量时调用构造函数以外的代码。

如果要执行的代码,如:

intest[0] = new int; 

你将不得不执行它主要槽或其他功能,否则程序将不知道执行它。

+0

你明白我的意思吗? – David 2012-04-18 08:51:48

相关问题