【问题标题】:realloc() deletes first elementrealloc() 删除第一个元素
【发布时间】:2025-12-01 14:25:01
【问题描述】:

我有这个功能:

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] 来检查这一点。 我使用这个 main 对其进行了测试:

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

【问题讨论】:

    标签: c return-value dynamic-memory-allocation realloc


    【解决方案1】:

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

    【讨论】:

    • 我试着像你说的那样编辑这行,但我仍然得到和以前一样的奇怪行为。
    • @DaniloMaglia 我在你的函数 creaNodo 中描述了这个问题。我不知道你在你的程序中做了什么。
    • 我用调试器再次检查,它几乎修复了。虽然我在函数 known[0] 中,但在调用 realloc 后现在不会丢失它的原始值,但是现在当我返回主函数并再次检查 known[0] 时,它的值又是 0x0。
    • @DaniloMaglia 选择最佳答案关闭问题并提出一个新问题,提供一个演示问题的最小完整程序。
    最近更新 更多