首页 > 解决方案 > 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);
    }
}

标签: creturn-valuedynamic-memory-allocationrealloc

解决方案


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;
//... 

推荐阅读