我正在使用全局数组(我知道它们是邪恶的)。这不是一个问题,但我不知道为什么它以一种方式工作而不是另一种方式,因为它们应该是相同的。 (在我目前的工作方式之后,我需要释放内存)。
无论如何,我有这个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...)
答案 0 :(得分:2)
数组的名称是不是指针。在大多数情况下,它衰减成一个指针,但是当它没有时,它就不会。所以如果你有:
Snake snakes[8];
在一个源文件中
extern Snake *snakes; // don't do this
另一方面,你会遇到各种各样的神秘问题,包括崩溃。对于数组,extern声明必须声明一个数组:
extern Snake snakes[];
顺便说一句,我知道这是因为多年前我有完全相同的问题,那时我才知道如何做到这一点。