在结构中设置数组元素时出现总线错误

Bus error when setting array element in struct

我有以下结构:

struct State {
    int num_walls;
    Wall walls[];

    int num_persons;
    Person persons[];
};

我想让人包含两个人,墙包含一个墙:

int num_walls = 1;
int num_preson = 2;

State simState = *(State*)malloc( sizeof(simState) + num_person*sizeof(Person) + num_walls*sizeof(Wall));
simState.num_walls = num_walls;
simState.num_persons = num_person;
simState.walls[0] = w;
simState.persons[0] = p1;
simState.persons[1] = p2;

当我这样做时,出现总线错误(核心已转储)。当我只设置人员时,一切正常。 IE。这有效:

int num_walls = 0;
int num_preson = 2;

State simState = *(State*)malloc( sizeof(simState) + num_person*sizeof(Person) + num_walls*sizeof(Wall));
simState.num_walls = num_walls;
simState.num_persons = num_person;
// simState.walls[0] = w;
simState.persons[0] = p1;
simState.persons[1] = p2;

代码是c++11,我用的是gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609

为什么会这样?

所以这是合法的 C++,它可能是您想要实现的目标

struct State {
    int num_walls;
    Wall* walls;
    int num_persons;
    Person* persons;
};

State simState;
simState.num_walls = num_walls;
simState.walls = new Wall[num_walls];
simState.num_persons = num_person;
simState.persons = new Person[num_person];
simState.walls[0] = w;
simState.persons[0] = p1;
simState.persons[1] = p2;

它不是很好的 C++,但至少它是合法的。

重要的一点(在任何一种语言中)是你不必分配 simState,它只是通过声明获得它的内存,但你必须分配你的两个可变长度数组 simState.personssimState.walls

不允许在 C++ 中定义无量纲数组,您应该按照其他人的说明使用带分配(new 甚至 malloc)的指针。

无量纲数组是 C99 中的有效构造,它不称为 VLA,而是 flexible array member。语言的这一特性只能用作结构的最后一个成员,并且在定义和使用方面有其他一些限制。绝对不经常使用的功能。

第一个例子中 "Bus error" 的原因是 wall 的非法定义,它不是结构的最后一个成员。由于 person 已正确定义,您正在访问内存结构并覆盖其他内容,这实际上不是您想要做的。 GCC 是您的程序即使在无效时也能编译的原因,因为默认情况下启用了许多扩展。请使用 -pedantic 标志和 C++ 标准版本 (-std=c++11) 来获得警告。