c - realloc() 删除第一个元素
问题描述
我有这个功能:
node* creaNodo(coordinata pos, node** known, int* nKnown){
node* nodo = exists(known, pos, *nKnown);
if(nodo == NULL){
(*nKnown)++;
realloc(known, (*nKnown) * sizeof(node*));
nodo = malloc(sizeof(node) * 1);
nodo->nNextNodes = 0;
nodo->nextNodes = NULL;
nodo->nPreviousNodes = 0;
nodo->previousNodes = NULL;
nodo->posizione = pos;
known[*nKnown - 1] = nodo;
}
return nodo;
}
它基本上检查我的数组中是否已经存在一个节点(已知),如果没有,它将它添加到我的数组中,或者如果存在,它返回现有节点。我对 realloc 有这种奇怪的行为,在我调用函数的一些迭代之后,realloc 丢失了我的数组的第一个元素,将其值设置为 NULL (0x0)。我通过使用 gdb 运行代码并添加到已知的监视列表 [0] 来检查这一点。我使用这个主要测试它:
int main(){
node** known = malloc(sizeof(node*) * 1);
int nKnown = 0;
for(int i = 0; i < 20; i++){
coordinata* tmp = assegnaCoordinata(i,i);
creaNodo(*tmp, known, &nKnown);
}
}
解决方案
realloc 调用的返回值不存储在任何变量中
realloc(known, (*nKnown) * sizeof(node*));
因此,如果您尝试通过存储在变量中的地址访问内存,那么这样的调用会调用未定义的行为known
。
至少你需要写
known = realloc(known, (*nKnown) * sizeof(node*));
尽管最好使用中间变量,因为该函数可以返回一个空指针,例如
node** tmp = realloc(known, (*nKnown) * sizeof(node*));
if ( tmp != NULL ) known = tmp;
//...
推荐阅读
- json - JOLT 转换 - 将新元素命名为数组元素的值
- android - 致命异常:java.lang.IllegalStateException 无法为 WebView 创建层(在 Lenove K5 Note Android 6.0 上崩溃)
- java - Json Meta Schema:如何限制另一个 Json Schema 嵌套对象
- powershell - 选择并输出特定的 CSV 文件记录
- jsf - 加强跨站点脚本:糟糕的验证 JSF
- gremlin - Gremlin - 停止创建多个边缘
- java - 使用 maven 嵌套依赖包含而不创建阴影 jar
- powershell - 术语“Get-ObjectAcl”未被识别为 cmdlet 的名称
- javascript - 使用 vanilla JS 在两个输入类型 =“datetime-local”字段之间复制值
- function - 需要GoLang函数声明解释