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

使用malloc创建二维数组触发Segmentation Fault问题求助

问题描述

我正在为一款小游戏制作地图,用malloc初始化二维数组时,注释掉printMap函数后主函数能正常运行,但调用printMap显示地图就会触发Segmentation Fault。完全找不到问题所在,求帮忙。

要求代码遵循C89标准,编译参数为-ansi -pedantic -Wall -Werror。


原始代码

GAME.C文件

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"random.h"

void createMap(char*** map, int xCoord, int yCoord) {
    int i, j;
    xCoord += 2;
    yCoord += 2;
    char** mapArray;

    mapArray = (char**)malloc(yCoord * sizeof(char*));
    for (i = 0; i < yCoord; i++) {
        mapArray[i] = (char*)malloc(xCoord * sizeof(char));
    }
    for (i = 0; i < yCoord; i++) {
        for (j = 0; j < xCoord; j++) {
            mapArray[i][j] = "0";
        }
    }
    *map = mapArray;
}

void printMap(char** map, int xCoord, int yCoord) {
    xCoord += 2;
    yCoord += 2;
    printf("%d, %d", xCoord, yCoord);
    int i, j;
    
    for (i = 0; i < yCoord; i++) {
        for (j = 0; j < xCoord; i++) {
            printf("%d %d", i, j);
            printf("%c", map[i][j]);
        }
        printf("\n");
    }
}

MAIN.C文件

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "random.h"
#include "game.h"

int main(void) {
    int xCoord = 5;
    int yCoord = 5;

    char** map;

    createMap(&map, xCoord, yCoord);
    
    printMap(map, xCoord, yCoord);
    return 0;
}

错误分析与修复

1. printMap循环变量写错

内层循环里写的是for (j = 0; j < xCoord; i++),本该递增列索引j,结果写成了递增行索引i,导致i会快速超出数组的行范围(原本最大是yCoord-1),访问了不属于数组的内存,直接触发段错误。

修改成:

for (j = 0; j < xCoord; j++) {

2. createMap字符赋值类型不匹配

mapArray[i][j] = "0";是把字符串字面量的地址(char*类型)赋值给char类型变量,C89下用-Werror编译会直接报错,即使强行编译,后续访问时也会把指针值当作字符输出,完全不符合预期。

改成单引号包裹的字符字面量:

mapArray[i][j] = '0';

修复后的完整代码

GAME.C文件

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"random.h"

void createMap(char*** map, int xCoord, int yCoord) {
    int i, j;
    xCoord += 2;
    yCoord += 2;
    char** mapArray;

    mapArray = (char**)malloc(yCoord * sizeof(char*));
    for (i = 0; i < yCoord; i++) {
        mapArray[i] = (char*)malloc(xCoord * sizeof(char));
    }
    for (i = 0; i < yCoord; i++) {
        for (j = 0; j < xCoord; j++) {
            mapArray[i][j] = '0';
        }
    }
    *map = mapArray;
}

void printMap(char** map, int xCoord, int yCoord) {
    xCoord += 2;
    yCoord += 2;
    printf("%d, %d\n", xCoord, yCoord);
    int i, j;
    
    for (i = 0; i < yCoord; i++) {
        for (j = 0; j < xCoord; j++) {
            printf("%c", map[i][j]);
        }
        printf("\n");
    }
}

MAIN.C文件

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "random.h"
#include "game.h"

int main(void) {
    int xCoord = 5;
    int yCoord = 5;

    char** map;

    createMap(&map, xCoord, yCoord);
    
    printMap(map, xCoord, yCoord);
    
    // 释放内存,避免内存泄漏
    for (int i = 0; i < yCoord + 2; i++) {
        free(map[i]);
    }
    free(map);
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:45:40