Кадр стека в памяти после возврата функции

Что происходит с кадром стека после вызова функции? У меня есть функция, которая возвращает адрес локальной переменной - могу ли я это сделать, или кадр стека разрушается после возврата функции? Вот мой код - я ожидал получить неправильный результат, но вместо этого я получил правильный результат.

#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 в соответствующее время.

Вы никогда не должны возвращать ссылку на локальные переменные. Ваш долгоживущий внешний указатель наверняка примет эту ссылку, но память, которая будет восстановлена ​​(и перезаписана) при следующем вызове функции, так что ваш указатель будет указывать на мусор.

В вашем случае просто верните значение вместо ссылки.

Другие вопросы по тегам