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

C语言用结构体数组共享内存模拟矩阵 赋值时出现段错误如何解决

问题根因

你触发段错误的核心原因是共享内存申请的空间大小不足:
你调用shmget时传入的第二个参数是LENGTH(即60*20=1200),这个值是结构体数组的元素个数,而非实际需要的字节数。你要存储1200个cell类型的结构体,需要申请的总字节数应为LENGTH * sizeof(cell)。你仅申请了1200字节的共享内存,但实际需要的空间远大于该值,循环赋值时访问到了未申请的内存地址,就触发了段错误。

修复后完整代码
#include <stdio.h>
#include <sys/shm.h>
#define WIDTH 60
#define HEIGHT 20
// 宏定义加括号避免后续使用时出现运算符优先级问题
#define LENGTH (WIDTH*HEIGHT)

typedef struct _Cell{
    int passthroughNum;
    int capacity;
    double passthroughTime;
    char cell;
} cell;

int main() {
    int i,shmap_id;
    char symbol = '*';
    cell *map;

    // 修复:申请空间大小改为 元素个数 * 单个结构体的字节数
    if((shmap_id = shmget(IPC_PRIVATE, LENGTH * sizeof(cell), IPC_CREAT | 0666)) == -1) {
        perror("shmget (map)");
        return 1;
    }
    map = (cell *)shmat(shmap_id, NULL, 0);
    if(map == (cell *)(-1)) {
        perror("shmat (map)");
        shmctl(shmap_id, IPC_RMID, NULL);
        return 1;
    } 
    for(i=0;i<LENGTH;i++) {
        map[i].cell = symbol;
    }

    // 此处可添加你的地图打印逻辑

    // 共享内存使用完的清理逻辑,避免资源泄露
    shmdt(map);
    shmctl(shmap_id, IPC_RMID, NULL);
    return 0;
}
额外注意事项
  • 系统调用报错后要及时终止程序,避免后续无效逻辑执行触发更多异常
  • 共享内存使用完毕后必须先解除挂载、再销毁,避免系统残留无用的共享内存资源

内容的提问来源于stack exchange,提问作者CommuBoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:57:04