C语言中为二维数组赋值0时出现段错误,求原因及正确索引方式
二维数组初始化段错误的原因与修复方案
你的代码存在两处关键问题,直接引发了段错误:
1. 内存分配逻辑完全错误
int** 类型代表的是指向指针数组的指针,实现二维数组需要两层内存分配:
- 第一层:分配存储行指针的数组(比如
height个int*,对应二维数组的每一行) - 第二层:给每个行指针分配对应列数的
int内存(每个行指针指向width个int的数组)
但你直接分配了width*height个int*的内存,既浪费空间,又没有给array_pointer[i]赋值有效地址——此时array_pointer[i]是野指针,访问array_pointer[i][j]必然触发段错误。
2. 参数合法性检查顺序错误
你先执行了内存分配,再检查width和height是否合法。如果参数不合法(比如小于等于0),直接返回NULL,之前分配的内存会永久泄漏。
修正后的代码
int **alloc_grid(int width, int height) { int **array_pointer; int i; int j; // 先做参数合法性校验,不合法直接返回 if (width <= 0 || height <= 0) return NULL; // 分配行指针数组,共height个行指针 array_pointer = malloc(sizeof(int *) * height); if (array_pointer == NULL) return NULL; // 为每个行指针分配列内存,并初始化元素为0 for (i = 0; i < height; i++) { array_pointer[i] = malloc(sizeof(int) * width); // 分配失败时回滚已分配的内存,避免泄漏 if (array_pointer[i] == NULL) { while (i > 0) free(array_pointer[--i]); free(array_pointer); return NULL; } // 初始化当前行的所有元素为0 for (j = 0; j < width; j++) array_pointer[i][j] = 0; } return array_pointer; }
关键修正点说明
- 调整参数检查顺序,避免无效内存分配
- 按二维数组的标准结构分配内存:先分行指针,再分每行的元素内存
- 添加内存分配失败的回滚逻辑,防止内存泄漏
- 采用行优先的索引方式(
array_pointer[i][j]代表第i行第j列),符合常规二维数组的访问习惯
内容的提问来源于stack exchange,提问作者Olamide Olanrewaju
相关产品推荐
相关产品推荐

