Распределение адресов памяти - PullRequest
0 голосов
/ 12 апреля 2010

Я не понимаю, как это происходит. Это часть моего кода ..

   int isGoal(Node *node, int startNode){

       int i;
   .
   .
   }

Когда я отлаживал это с помощью gdb, я обнаружил, что 'i' было выделено по адресу памяти, который был ранее выделен.

(gdb)print &node->path->next
$26 = (struct intNode **) 0xffbff2f0

(gdb) print &i
$22 = (int *) 0xffbff2f0

node-> path-> next уже определен вне этой функции. Но, как вы можете видеть, они имеют один и тот же адрес, который в какой-то момент делает указатель на другое место при изменении счетчика i .

Я скомпилировал его, используя gcc на платформе Solaris Любая помощь будет принята с благодарностью ..

Ответы [ 2 ]

3 голосов
/ 12 апреля 2010

Память для i берется из стека или того, что в C иногда называют "автоматическим хранением".

Содержимое памяти, выделенной из стека, больше не действует после того, как функция объявила, что память вернулась. Например, ваша функция isGoal() выделяет стековое хранилище для переменной i, и хранилище существует только до момента времени, когда isGoal() вернется.

Причина, по которой вы видите, что адрес i, &i уже существовал во время вашей программы, заключается в том, что область стековой памяти постоянно используется повторно. До того, что вы видите в gdb, вы сохранили адрес переменной стека в node->path->next.

Чтобы получить память, которая остается действительной после возвращения функции выделения, вы должны использовать malloc() и free(), чтобы получить то, что называется «динамическая память» или, иногда, память из «кучи».

0 голосов
/ 12 апреля 2010

Две возможности:

  • Вы скомпилировали с оптимизацией, и это сбивает с толку GDB (например, i может быть оптимизирован, так что у него фактически нет адреса)
  • node->path не указывает на правильно распределенную память. Например, этот указатель мог быть установлен для указания на объект в стеке, который впоследствии вышел из области видимости.
...