咨询C语言动态分配矩阵并填充时触发Segmentation fault的原因
触发Segmentation fault的核心原因
当前代码存在直接导致堆内存越界的错误,最终触发非法内存访问的段错误,具体问题如下:
- 二维指针的基础内存分配大小计算完全错误
对应代码片段:char ** grid = malloc(size * sizeof(char));grid的类型是char **,本质是用来存储一组char *类型指针的数组,每个数组元素是长度为8字节(64位系统)/4字节(32位系统)的指针,而非1字节的char类型。代码按照sizeof(char)的大小申请内存,相当于仅申请了size * 1字节的空间,却要在这个空间内存放size个远大于1字节的指针,直接踩穿申请的内存边界、破坏相邻的堆结构,后续的指针赋值、内存读写全属于非法访问。
正确的匹配类型的写法为:char ** grid = malloc(size * sizeof(char *)); - 缺失必要的内存申请结果校验
所有malloc调用都没有校验返回值是否为NULL,如果系统内存不足导致申请失败,直接对返回的空指针做索引赋值、读写操作,会直接触发非法内存访问。 - 附带的资源管理遗漏
代码中所有通过malloc申请的堆内存,都没有在使用完成后调用free释放,虽然不会直接触发段错误,但长期运行会造成内存泄漏。
补充说明:代码中为每个
grid[row]分配size * sizeof(char)内存的逻辑,在修正上述第一处分配错误后,是可以正常支撑grid[i][j] = 1的char类型赋值的,这部分的大小计算和元素需求是匹配的。
内容的提问来源于stack exchange,提问作者Théo Monarc
相关产品推荐
相关产品推荐

