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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 20:36:05