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

