2017-02-13 17 views
0

Я не понимаю, почему работает следующий код C (печатает «53»). Я думал, что int a будет помещен в стек и вытер, как только foo() выйдет. Если компилятор вместо этого размещает int a на куче, есть ли способ сказать это не так?Является ли компилятор помещением памяти в кучу?

#include "stdio.h" 

int * foo() 
{ 
    int a = 53; 

    int * b = &a; 

    return b; 
} 

int main(void) 
{ 
    int * c = foo(); 

    printf("%d\n",*c); 

    return 0; 
} 
+1

Это именно то, что происходит. Эта программа имеет неопределенное поведение. – Jon

+1

Вам просто повезло?!. 'a' aka' b' был в стеке - теперь вы живете в мире неопределенного поведения. –

+1

Вам нужно вызвать другую функцию. У вашего указателя стека нет причин переписывать его чем-либо еще. – jiveturkey

ответ

1

Целое число a хранится в стеке. Причина этого заключается в том, что функция foo возвращает адрес a и функция main разыгрывает этот адрес, чтобы распечатать его до того, как содержимое адреса a будет перезаписано. В этом случае эта программа работает случайно. Если вы хотите сохранить значение a в течение всего срока действия программы, вам необходимо либо применить квалификатор static к объявлению a, либо выделить a в кучу.