我目前正在使用网络模拟器2进行项目。当我在结构re_block中添加变量时,程序会编译但在运行时会给我分段错误。当我将变量声明为静态时,没有运行时错误。有人请解释一下。
struct re_block {
# if __BYTE_ORDER == __BIG_ENDIAN
u_int16_t g : 1;
u_int16_t prefix : 7;
u_int16_t res : 2;
u_int16_t re_hopcnt : 6;
# elif __BYTE_ORDER == __LITTLE_ENDIAN
u_int16_t res : 2;
u_int16_t re_hopcnt : 6;
u_int16_t g : 1;
u_int16_t prefix : 7;
# else
# error "Adjust your <bits/endian.h> defines"
# endif
u_int32_t re_node_addr;
u_int32_t re_node_seqnum;
};
#define MAX_RE_BLOCKS
typedef struct {
u_int32_t m : 1;
u_int32_t h : 2;
u_int32_t type : 5;
u_int32_t len : 12;
u_int32_t ttl : 6;
u_int32_t i : 1;
u_int32_t a : 1;
u_int32_t s : 1;
u_int32_t res1 : 3;
u_int32_t target_addr;
u_int32_t target_seqnum;
u_int8_t thopcnt : 6;
u_int8_t res2 : 2;
struct re_block re_blocks[MAX_RE_BLOCKS];
} RE;
我想在struct re_block中添加两个float变量。请帮忙
答案 0 :(得分:0)
使用valgrind
之类的内存调试工具,您是否可以在代码中找到发生段错误的位置?我的猜测是有一些运行时代码利用re_block
结构的数据布局,例如通过将指针转换为re_block
实例来键入(u_int16_t *)
并取消引用为获取第一个成员的方法,而不是使用运算符->
。向结构中添加成员可以更改数据的布局,因此使用此类技巧的代码可能会中断。