使用双指针动态分配初始化二维数组时出现段错误求助
段错误原因分析与修复方案
核心问题
你创建二维指针数组时,指针数组的内存分配大小计算错误。
int **ptr是指向指针数组的指针,它需要存储5个int*类型的指针。但你用了malloc(sizeof(int)*5),多数系统中int占4字节,int*占8字节(64位环境),这就导致你只分配了20字节的内存,远不足以容纳5个指针。
前几次循环(i=0到3)时,写入的指针刚好挤在分配的内存范围内,不会触发错误;但当i=4时,写入位置超出了malloc分配的内存边界,触发了段错误。
修复后的代码
把指针数组的分配大小改成sizeof(int*),或者更健壮的sizeof(*ptr)(自动匹配指针类型),同时建议增加内存分配失败的检查和内存释放逻辑:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ int **ptr = (int **)malloc(sizeof(*ptr)*5); if (ptr == NULL) { perror("malloc failed for pointer array"); return 1; } for(int i = 0; i<5; i++){ ptr[i] = (int *)malloc(sizeof(int)*2); if (ptr[i] == NULL) { perror("malloc failed for row"); // 释放已分配的内存避免泄漏 for (int k = 0; k < i; k++) { free(ptr[k]); } free(ptr); return 1; } } for(int i = 0; i<5; i++){ for(int j = 0; j<2; j++){ ptr[i][j] = i; } } // 释放动态分配的内存 for(int i = 0; i<5; i++){ free(ptr[i]); } free(ptr); return 0; }
额外提示
- 每次malloc后必须检查返回值是否为
NULL,防止空指针操作导致程序崩溃。 - 使用
sizeof(*ptr)代替具体类型的sizeof,代码更易维护,类型变更时无需手动修改。 - 动态分配的内存一定要记得释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Luigi_S_R
相关产品推荐
相关产品推荐

