You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:21:03