C语言封装realloc函数触发segmentation fault段错误问题咨询
问题结论
是的,该段错误确实是p[i] = i * 2;行的空指针解引用直接导致的。
错误根因分析
- C语言的函数参数采用值传递规则,你在
reallocmem函数中定义的形参int *p是main函数中实参指针p的本地副本 - 你在函数内对形参
p = q的赋值操作,仅会修改本地副本的指向,完全不会影响main函数中原始指针p的取值 - main函数中的
p初始化值为0x0(也就是空指针),调用reallocmem后仍然是空指针,执行p[i]时本质是访问0 + i * sizeof(int)的零页地址,触发操作系统的内存访问保护,抛出段错误。
修复方案
你可以选择两种常见修改方式解决该问题:
方案1:修改封装函数返回新指针
// 函数直接返回realloc后的新指针,分配失败返回NULL int* reallocmem(int *p,size_t newsize){ void *q = realloc(p, newsize); return q; } int main(void) { int *p = 0x0; p = reallocmem(p, 10*sizeof(int)); if(p == NULL){ fprintf(stderr,"Could not reallocate memory\n"); return 1; // 分配失败直接退出,避免后续访问空指针 } int i; int size = 10; for(i = 0;i<size;i++){ p[i] = i * 2; } for(i = 0;i<size;i++){ printf("%d\n",p[i]); } free(p); return 0; }
方案2:传入二级指针修改原变量
// 传入指针变量的地址,直接修改原指针的取值 int reallocmem(int **p,size_t newsize){ void *q = realloc(*p, newsize); if(q != NULL){ *p = q; return 1; } return 0; } int main(void) { int *p = 0x0; if(!reallocmem(&p,10*sizeof(int))){ fprintf(stderr,"Could not reallocate memory\n"); return 1; } int i; int size = 10; for(i = 0;i<size;i++){ p[i] = i * 2; } for(i = 0;i<size;i++){ printf("%d\n",p[i]); } free(p); return 0; }
内容的提问来源于stack exchange,提问作者victor 0x3E7
相关产品推荐
相关产品推荐

