Память для i
берется из стека или того, что в C иногда называют "автоматическим хранением".
Содержимое памяти, выделенной из стека, больше не действует после того, как функция объявила, что память вернулась. Например, ваша функция isGoal()
выделяет стековое хранилище для переменной i
, и хранилище существует только до момента времени, когда isGoal()
вернется.
Причина, по которой вы видите, что адрес i
, &i
уже существовал во время вашей программы, заключается в том, что область стековой памяти постоянно используется повторно. До того, что вы видите в gdb, вы сохранили адрес переменной стека в node->path->next
.
Чтобы получить память, которая остается действительной после возвращения функции выделения, вы должны использовать malloc()
и free()
, чтобы получить то, что называется «динамическая память» или, иногда, память из «кучи».