1

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

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

Snake snakes[8];

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

extern Snake * snakes;

数组的名称是一个指针,所以我认为这应该可行。奇怪的是,它没有。我不知道为什么。

但是,当我将声明从原来的内容更改为:

Snake * snakes;

然后像这样分配它:

snakes = new Snake [8];

有用!但是,当蛇的数量不变时,我需要释放一些我不想这样做的东西。(8)。

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

知道是什么原因造成的吗?

在旁注中,全局变量在命名空间中仍然是邪恶的吗?(不是匿名的)。我之所以这样问是因为我正在努力养成 OO 习惯并在逻辑上构建事物,与我最后的努力相比,我确信这会得到回报,封装、组织等都是有意义的。(也许几年后,编译时间)。尽管如此,必须在函数调用中包含一个作用域变量以进行设置似乎......很糟糕。这是正确的还是有更好的方法?(然后是全局、命名空间或其他)

编辑:错误是一个段错误,在成员函数的行。

蛇成员函数:

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

来自外部全局数组的文件的调用:

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

1 回答 1

3

数组的名称不是指针。在大多数情况下,它会衰减为指针,但当它没有衰减时,它不会。因此,如果您有:

Snake snakes[8];

在一个源文件中和

extern Snake *snakes; // don't do this

在另一种情况下,您会遇到各种神秘问题,包括崩溃。对于数组,extern 声明必须声明一个数组:

extern Snake snakes[];

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

于 2012-10-13T18:20:30.593 回答