C语言编写记忆卡牌游戏时for循环中途触发Segfault段错误求助
问题修复方案
核心原因
你遇到的段错误由动态内存分配时的类型大小计算错误导致:ARMv8为64位架构,指针长度为8字节,但你分配指针数组时错误使用了sizeof(int)(仅占4字节),分配的内存空间不足,访问时触发越界崩溃。
小数值N(1、2)能正常运行是因为所需内存少,刚好适配内存对齐的冗余空间,N≥3时内存需求超过分配的空间,就会触发崩溃。
具体修复点
- 第一层
board分配修复:board是int***类型,每个元素为int**指针,将原来的malloc(2 * users_N * sizeof(int))改为malloc(2 * users_N * sizeof(int**)) - 第二层
board[i]分配修复:board[i]是int**类型,每个元素为int*指针,将原来的malloc(2 * users_N * sizeof(int))改为malloc(2 * users_N * sizeof(int*))
更稳妥的写法是用
sizeof(*变量名)自动匹配元素大小,避免手动写错类型,比如第一层可以写为malloc(2 * users_N * sizeof(*board)),无需手动区分指针类型。
修正后的内存分配代码片段
int main(int argc, char *argv[]) { if (argc < 3){ printf("Missing argument. Exiting... \n"); return 0; } users_N = atoi(argv[2]); srand(time(NULL)); // 修正第一层分配 int ***board = (int ***)malloc(2 * users_N * sizeof(int**)); for (int i = 0; i < 2 * users_N; i++){ // 修正第二层分配 board[i] = (int **)malloc(2 * users_N * sizeof(int*)); for (int j = 0; j < 2 * users_N; j++){ board[i][j] = (int *)malloc(2 * sizeof(int)); } } initialize(board); }
内容的提问来源于stack exchange,提问作者pi-sister
相关产品推荐
相关产品推荐

