realloc() удаляет первый элемент

#c #return-value #dynamic-memory-allocation #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;
}
 

Это в основном проверяет, существует ли узел уже в моем массиве (известном), и если он этого не делает, он добавляет его в мой массив или, если да, возвращает существующий узел. У меня такое странное поведение с перераспределением, когда после некоторой итерации моего вызова функции перераспределение теряет первый элемент моего массива, устанавливая его значение равным НУЛЮ (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, amp;nKnown);
    }
}
 

Ответ №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;
//... 
 

Комментарии:

1. Я попытался отредактировать строку, как вы сказали, но у меня все еще такое же странное поведение, как и раньше.

2. @DaniloMaglia Я описал проблему в вашей функции creaNodo. Я не знаю, что вы делаете что-то еще в своей программе.

3. Я еще раз проверил отладчик, и он почти исправился. Пока я нахожусь внутри функции, известной[0], теперь она не теряет своего исходного значения после вызова перераспределения, но теперь, когда я возвращаюсь к основной и снова проверяю известную[0], ее значение снова равно 0x0.

4. @DaniloMaglia Закройте вопрос, выбрав лучший ответ, и задайте новый вопрос, предоставив минимальную полную программу, демонстрирующую проблему.