переменные локального указателя - PullRequest
0 голосов
/ 17 октября 2011

Какими будут выходные данные следующей программы?

int *call();

void main() {
  int *ptr = call();
  printf("%d : %u",*ptr,ptr);
  clrscr();
  printf("%d",*ptr);
}

int *call() {
  int x = 25;
  ++x;
  //printf("%d : %u",x,&x);
  return &x;
}

Ожидаемый результат: Мусорное значение
Фактический результат: 26 # someaddr

Поскольку x - локальная переменная, ее область действиязаканчивается в вызове функции.Я нашел этот код в качестве примера для висящего указателя.

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

его Неопределенное поведение

, так как в x область видимости не вернулась после возврата из call (), поэтому указатель на эту переменную вы не можете использовать ahaed

, Скомпилировав свойВ программе вы получите следующую ошибку

warning: function returns address of local variable

, если ваша программа с тех пор выдала вывод 26, так как она имеет неопределенное поведение.Вы не должны делать это вообще.

1 голос
/ 17 октября 2011

вывод этой функции не определен.Как вы уже указали, область действия x заканчивается функцией.Но память, где 26 было написано, не используется agian.Таким образом, печать этого значения даст 26. Если эта память будет использоваться снова, это может быть что угодно.

0 голосов
/ 17 октября 2011

Добро пожаловать, вы вошли в долину Undefined Behavior. Вы не можете предсказать, что будет иметь какое-либо значение. Даже если значение имеет какой-то смысл, игнорируйте его.

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