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

C语言调用realloc扩容时动态数组首元素变为NULL丢失问题求助

问题原因
  • realloc使用不符合规范。realloc不会修改传入的原指针本身,只会返回扩容后的新内存地址,你直接丢弃返回值的操作会触发未定义行为:如果原内存块后续连续空间不足,系统会申请新内存块并拷贝旧数据,原内存会被自动释放,你持有的旧known指针就变成野指针,访问时就会出现你遇到的首元素变NULL、数据丢失的问题;如果realloc申请失败返回NULL,还会直接导致原内存块泄漏。
  • C语言函数参数为值传递,你在creaNodo函数内部修改形参known的指向,不会对外部main函数里的known实参生效,就算你把realloc返回值赋值给函数内的known,外部拿到的还是已经失效的旧指针。
修正方案

这里选择传三级指针的方案修正,修改后的代码如下:

修正后的creaNodo函数

node* creaNodo(coordinata pos, node*** known, int* nKnown){
    node* nodo = exists(*known, pos, *nKnown);
    if(nodo == NULL){
        (*nKnown)++;
        // 用临时指针接收realloc返回值,避免申请失败丢失原指针
        node** new_known = realloc(*known, (*nKnown) * sizeof(node*));
        if(new_known == NULL) {
            (*nKnown)--;
            // 可根据需求添加错误处理逻辑
            return NULL;
        }
        *known = new_known;
        nodo = malloc(sizeof(node));
        nodo->nNextNodes = 0;
        nodo->nextNodes = NULL;
        nodo->nPreviousNodes = 0;
        nodo->previousNodes = NULL;
        nodo->posizione = pos;
        (*known)[*nKnown - 1] = nodo;
    } 
    return nodo;
}

修正后的main函数

int main(){
    node** known = malloc(sizeof(node*) * 1);
    int nKnown = 0;
    for(int i = 0; i < 20; i++){
        coordinata* tmp = assegnaCoordinata(i,i);
        // 传入known的地址,让函数内部可以修改外部的指针指向
        creaNodo(*tmp, &known, &nKnown);
    }
    // 程序退出前记得释放所有node和known数组的内存,避免泄漏
}

内容的提问来源于stack exchange,提问作者Danilo Maglia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:06:00