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
相关产品推荐
相关产品推荐

