You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体含数组引发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]);
}

错误原因分析

问题出在二维柔性数组的不规范使用:

  1. C语言标准中,柔性数组只能是一维形式(type name[]或type name[0]),且必须作为结构体的最后一个成员。你声明的int home[][2]属于不完整类型的二维数组,不符合标准规范,编译器的兼容处理会导致内存布局异常。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:45:50