realloc() 删除第一个元素

realloc() deletes first element

我有这个功能:

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;
}

它主要检查我的数组中是否已经存在一个节点(已知),如果不存在,则将其添加到我的数组中,或者,如果存在,则 return 现有节点。我对 realloc 有这种奇怪的行为,在我调用函数的一些迭代之后,realloc 丢失了我的数组的第一个元素,将其值设置为 NULL (0x0)。我通过 运行 使用 gdb 的代码检查了这一点,并添加到我的观察列表 known[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的return值没有存储在任何变量中

realloc(known, (*nKnown) * sizeof(node*));

因此,如果您尝试通过存储在变量 known 中的地址访问内存,这样的调用会调用未定义的行为。

至少你需要写

known = realloc(known, (*nKnown) * sizeof(node*));

虽然最好使用中间变量,因为函数可以 return 一个空指针,例如

node** tmp = realloc(known, (*nKnown) * sizeof(node*));

if ( tmp != NULL ) known = tmp;
//...