在结构中设置数组元素时出现总线错误
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.persons
和 simState.walls
不允许在 C++ 中定义无量纲数组,您应该按照其他人的说明使用带分配(new 甚至 malloc)的指针。
无量纲数组是 C99 中的有效构造,它不称为 VLA,而是 flexible array member。语言的这一特性只能用作结构的最后一个成员,并且在定义和使用方面有其他一些限制。绝对不经常使用的功能。
第一个例子中 "Bus error" 的原因是 wall 的非法定义,它不是结构的最后一个成员。由于 person 已正确定义,您正在访问内存结构并覆盖其他内容,这实际上不是您想要做的。 GCC 是您的程序即使在无效时也能编译的原因,因为默认情况下启用了许多扩展。请使用 -pedantic 标志和 C++ 标准版本 (-std=c++11) 来获得警告。
我有以下结构:
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.persons
和 simState.walls
不允许在 C++ 中定义无量纲数组,您应该按照其他人的说明使用带分配(new 甚至 malloc)的指针。
无量纲数组是 C99 中的有效构造,它不称为 VLA,而是 flexible array member。语言的这一特性只能用作结构的最后一个成员,并且在定义和使用方面有其他一些限制。绝对不经常使用的功能。
第一个例子中 "Bus error" 的原因是 wall 的非法定义,它不是结构的最后一个成员。由于 person 已正确定义,您正在访问内存结构并覆盖其他内容,这实际上不是您想要做的。 GCC 是您的程序即使在无效时也能编译的原因,因为默认情况下启用了许多扩展。请使用 -pedantic 标志和 C++ 标准版本 (-std=c++11) 来获得警告。