【发布时间】:2020-04-14 08:08:41
【问题描述】:
我有以下结构:
struct State {
int num_walls;
Wall walls[];
int num_persons;
Person persons[];
};
我想让 Persons 包含两个 Persons,而墙壁包含一个 Wall:
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
为什么会这样?
【问题讨论】:
-
您的
struct State定义不正确,无法编译。请提供您的实际代码。 -
这是不合法的 C++
Wall walls[]; -
@john 也不是合法的 C,因为不在
struct的末尾。 OP:请仅标记您打算使用的语言。 C 或 C++。目前,代码不应以两种语言中的任何一种进行编译。 -
@FerdiK 请形成一个完整的minimal reproducible example 并告诉我们您正在使用哪个编译器来编译它,因为它不应该编译。
-
澄清一下,您使用的 GCC 版本确实可以编译代码。但是在 C++ 中不允许将具有未知边界的数组作为
struct成员,而在 C 中它们只允许在结构的末尾(所谓的“灵活数组成员”)。 GCC 允许它在结构中的其他位置似乎是一个错误,自 GCC 6 以来似乎已修复。使用-pedantic-errors标志强制 GCC 为此类在 C++ 中实际上不允许并且只是特定于编译器的扩展。
标签: c++ pointers struct bus-error