全局数组在正常声明时会导致段错误,但不会导致指针

时间:2012-10-13 18:15:13

标签: c++ arrays segmentation-fault global

我正在使用全局数组(我知道它们是邪恶的)。这不是一个问题,但我不知道为什么它以一种方式工作而不是另一种方式,因为它们应该是相同的。 (在我目前的工作方式之后,我需要释放内存)。

无论如何,我有这个Snake课程。我想,这是全局数组:

Snake snakes[8];

我有几个(或者无论如何)几个与之交互的类和函数。有问题的问题发生在Snake类中的setter函数。它编译好,但段错误。原来,这是一个空指针(0x0)。不知道为什么。在这种情况下,堆栈跟踪来自另一个文件的函数调用,该文件包含snake标头并具有:

extern Snake * snakes;

数组的名称是指针,所以我认为这应该有效。奇怪的是,事实并非如此。我不明白为什么。

但是,当我将声明更改为:

Snake * snakes;

然后像这样分配它:

snakes = new Snake [8];

有效!但是,当蛇的数量不变时,我需要解除我不想要的其他东西。 (8)。

此外,有问题的函数调用访问第0个元素,每次有8个元素。

知道是什么原因引起的吗?

另一方面,在命名空间中,全局变量仍然是邪恶的吗? (不是匿名的)。我问,因为我试图进入OO习惯并在逻辑上构建事物,与我最近的努力相比,我肯定会得到回报,封装,组织等都是有道理的。 (也许在几年内,编译时间)。仍然,必须在函数调用中包含一个范围变量进行设置似乎......糟糕。这是正确的还是有更好的方法? (然后是全局,命名空间或其他)

编辑:错误是成员函数行的段错误。

Snake成员函数:

void setValue(Some value here...) {this-> value = input)

来自传出全局数组的文件的调用:

snakes[0].setValue(some value here...)

1 个答案:

答案 0 :(得分:2)

数组的名称是不是指针。在大多数情况下,它衰减成一个指针,但是当它没有时,它就不会。所以如果你有:

Snake snakes[8];

在一个源文件中

extern Snake *snakes; // don't do this
另一方面,你会遇到各种各样的神秘问题,包括崩溃。对于数组,extern声明必须声明一个数组:

extern Snake snakes[];

顺便说一句,我知道这是因为多年前我有完全相同的问题,那时我才知道如何做到这一点。