Кадр стека в памяти после возврата функции
Что происходит с кадром стека после вызова функции? У меня есть функция, которая возвращает адрес локальной переменной - могу ли я это сделать, или кадр стека разрушается после возврата функции? Вот мой код - я ожидал получить неправильный результат, но вместо этого я получил правильный результат.
#include<stdio.h>
#include<stdlib.h>
int* sum(int a,int b)
{
int x=a+b;
return &x;
}
int main()
{
int*a;
int x=5,y=6;
a=sum(x,y);
printf("%d",*a);
return 0;
}
2 ответа
В этом случае x
выходит из области видимости, значение, которое он возвращает, становится недействительным, и поэтому любая ссылка на него является неопределенным поведением. Когда вещи выходят за рамки, это все равно что вернуть адрес квартире, которую вы больше не снимаете.
Что касается того, что происходит с памятью, оно может быть или не быть перезаписано. Это не важно С помощью x
вне этой области проблематично и не должно быть сделано. Эта функция, по сути, не может работать так, как задумано, поскольку ее значения бесполезны.
В этом тривиальном примере нет никакой причины возвращать указатель на int
когда вы могли бы вернуть int
за точно такую же стоимость.
Если вам нужно вернуть указатель на значение, созданное в функции, вы должны выделить его динамически, чтобы он не выпал из области видимости. Это также несет с собой неявное требование, что последующий код владеет этим указателем и будет вызывать free
в соответствующее время.
Вы никогда не должны возвращать ссылку на локальные переменные. Ваш долгоживущий внешний указатель наверняка примет эту ссылку, но память, которая будет восстановлена (и перезаписана) при следующем вызове функции, так что ваш указатель будет указывать на мусор.
В вашем случае просто верните значение вместо ссылки.