结构体含数组引发Segmentation fault (core dumped)问题求助
问题:添加结构体数组成员后出现Segmentation Fault错误排查
定义了包含路径数组的Enemy结构体用于指示敌人行走路径,添加home数组后程序出现Segmentation fault (core dumped)错误,未添加该数组时无此问题。
结构体定义
struct Enemy { bool scared; bool runhome; int posx; int posy; int home[][2]; //{x,y} };
变量初始化代码
struct Enemy pinky = {false, false, 1,1, {{1,1},{1,2},{1,3},{2,3},{3,3},{4,3},{4,2},{4,1},{3,1},{2,1}}}; struct Enemy clyde = {false, false, 1,19, {{1,19},{2,19},{3,19},{4,19},{5,19},{6,19},{7,19},{8,19},{8,18},{8,17},{8,16},{8,15},{7,15},{6,15},{6,16},{6,17},{5,17},{4,17},{3,17},{2,17},{1,17},{1,18}}}; struct Enemy blinky = {false, false, 17,1, {{17,1},{17,2},{17,3},{16,3},{15,3},{14,3},{14,2},{14,1},{15,1},{16,1}}}; struct Enemy inky = {false, false, 17,19, {{17,19},{16,19},{15,19},{14,19},{13,19},{12,19},{11,19},{10,19},{10,18},{10,17},{10,16},{10,15},{11,15},{12,15},{12,16},{12,17},{13,17},{14,17},{15,17},{16,17},{17,17},{17,18}}};
调用home数组的代码
else if(ghost->runhome) { int *targetposition; //decides which way to move targetposition = optimalpath(ghost->posx, ghost->posy, ghost->home[0][0], ghost->home[0][1]); }
错误原因分析
问题出在二维柔性数组的不规范使用:
- C语言标准中,柔性数组只能是一维形式(
type name[]或type name[0]),且必须作为结构体的最后一个成员。你声明的int home[][2]属于不完整类型的二维数组,不符合标准规范,编译器的兼容处理会导致内存布局异常。 - 即使编译器允许该写法,直接用初始化列表给柔性数组赋值是错误的:结构体的内存大小计算不包含柔性数组的空间,初始化时的路径数据会超出结构体分配的内存区域,造成内存越界,进而触发Segmentation Fault。
修正方案
方案1:改用指针存储路径数组(推荐,简单易维护)
将结构体中的home改为指向二维数组的指针,同时增加成员存储路径点数量,避免越界访问:
struct Enemy { bool scared; bool runhome; int posx; int posy; int (*home)[2]; // 指向int[2]类型的指针,对应每个路径点的{x,y} int home_count; // 存储路径点的总数 }; // 先单独定义路径数组 int pinky_home[][2] = {{1,1},{1,2},{1,3},{2,3},{3,3},{4,3},{4,2},{4,1},{3,1},{2,1}}; // 初始化结构体,绑定路径数组并传入长度 struct Enemy pinky = { false, false, 1, 1, pinky_home, sizeof(pinky_home) / sizeof(pinky_home[0]) // 计算路径点数量 }; // 其他Enemy变量按相同方式初始化
方案2:使用一维柔性数组模拟二维结构(标准C兼容)
如果需要用柔性数组,将二维路径数据转为一维连续存储,同时手动分配内存:
#include <stdlib.h> #include <string.h> struct Enemy { bool scared; bool runhome; int posx; int posy; int home_count; // 路径点数量 int home[]; // 一维柔性数组,按x1,y1,x2,y2...顺序存储 }; // 初始化pinky示例 struct Enemy *pinky = malloc(sizeof(struct Enemy) + 10 * 2 * sizeof(int)); pinky->scared = false; pinky->runhome = false; pinky->posx = 1; pinky->posy = 1; pinky->home_count = 10; // 复制路径数据到柔性数组 int pinky_data[] = {1,1,1,2,1,3,2,3,3,3,4,3,4,2,4,1,3,1,2,1}; memcpy(pinky->home, pinky_data, sizeof(pinky_data)); // 使用完后记得free(pinky)释放内存
内容的提问来源于stack exchange,提问作者Dislecsi
相关产品推荐
相关产品推荐

