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
相关产品推荐
相关产品推荐

