распределение памяти - PullRequest
       3

распределение памяти

0 голосов
/ 09 марта 2011
node *getnode()
    {
        node *x;
        x = (node*)malloc(sizeof(node));
        if (x==NULL)
            {
                    printf("no memory \n");
                    exit(1);
            }
        return x;
    }


*insert_rear(int item ,node *first)
    {
        node  *temp;
        node  *cur;
        temp = getnode();


        temp -> data = item;
        temp -> next = NULL;

        if (first == NULL)
        return temp;

        cur = first;
        while(cur -> next != NULL)
          {
            cur = cur -> next;
          }

        cur -> next = temp;
        return first;
    }

в insert_rear, когда функция вызывает getnode, она переходит к вышеупомянутой функции и создает узел во время отладки с использованием gdb, когда я сделал

(gdb) p temp
$7 = (struct classifier *) 0x8d8f080
(gdb) p &temp
$8 = (struct classifier **) 0xbff9cb04

в чем разница между этими двумя.

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

В

p &temp

вы печатаете адрес стека для переменной temp. С

p temp

вы печатаете значение temp (адрес выделенной памяти, возвращаемый getnode ()

1 голос
/ 09 марта 2011

Вы можете иметь несколько косвенных адресов: temp получил адрес указателя от getnode(), который указывает на память узла, выделенную malloc.

&temp - это адрес памяти, в которой хранится этот адрес (который указывает на узел).

В основном у вас есть

&temp ---(points to)---> Memory X ***temp*** ---(points to)---> Memory Y ****MEMORY from malloc of "type" node**** 

Так что, если вы используете *temp, вы получаете доступ к узлу. И если вы используете *(&temp) (не знаю, правильный ли это синтаксис ...), но вы получите доступ к temp, в котором хранится адрес, где хранится узел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...