2012-04-15 7 views
2

Действительно немой вопрос. Вот мой пример кода:Почему malloc не создает новую переменную?

#include <stdio.h> 
#include <stdlib.h> 

typedef struct sample { 
    int a; 
    int b; 
} SAMPLE_T; 

int main() { 
    int i, max = 4; 
    for (i = 0; i < max; i++) 
    { 
    SAMPLE_T * newsamp = (SAMPLE_T *)malloc(sizeof(SAMPLE_T)); 
    printf("addr: %x\n", &newsamp); 
    } 
} 

Я пытаюсь «создать» новую переменную каждый раз, когда я иду через петлю, и я подумал, что это будет делать трюк, так как malloc бы создать новую переменную на куча. Но, кажется, я что-то испортил. Вот результат:

addr: bfc29c4 
addr: bfc29c4 
addr: bfc29c4 
addr: bfc29c4 

Am Я не понимая, как malloc работает?

ответ

7

Адрес newsamp не меняется, что не удивительно. Попробуйте:

printf("addr: %x\n", newsamp) 

Кроме того, хотя это, очевидно, просто программа для игрушек, вы действительно должны освободить память до того, как цикл завершится.

+0

Право. Его в «реальном» коде, но я определенно уверен, что вы свободны. Благодарю. – Pat

+0

Лучше использовать «% p» при печати адресов. – Arun

5

Это потому, что вы печатаете адрес указателя newsamp (!!!!), который является переменной в стеке main. Это всегда то же самое.

Вы хотите напечатать сам указатель вместо:

printf("addr: %x\n", newsamp); 
+0

А, я был прав насчет действительно немой части вопроса. Благодарю. – Pat

1

Это должно быть printf("addr: %x\n", newsamp);

Вы не должны делать &newsamp, потому что принимает адрес указателя, а не то, что он указывает.

Смежные вопросы