#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 Закройте вопрос, выбрав лучший ответ, и задайте новый вопрос, предоставив минимальную полную программу, демонстрирующую проблему.