С висящим указателем вопрос - PullRequest
5 голосов
/ 12 марта 2011
char *xyz()
{
   char str[32];
   strcpy(str,"Hello there!");
   return(str);
}


void main()
{
  printf("%s",xyz());
}

Когда я вызываю xyz (), он возвращает висячий указатель?Спасибо

Ответы [ 5 ]

11 голосов
/ 12 марта 2011

Да, это висящий указатель. Ваша программа вызывает неопределенное поведение.

В некоторых системах это может привести к сбою вашего приложения, в других оно может работать правильно. Но в любом случае, вы не должны этого делать.

5 голосов
/ 12 марта 2011

Да, это приведет к ошибке висящего указателя.

Когда вы вызываете xyz (), 32 * sizeof (char) байта будут выделены в стеке в кадре стека xyz.Когда вы работаете в xyz (), вы модифицируете и работаете с этими байтами, которые были выделены в стеке.

В вызове return (str) используется имя массива str в качестве указателя, так что вы на самом делевозвращая адрес в массив str.После того, как вы вернулись, кадр стека для xyz разматывается, и локальная память, которая была в xyz для str, больше не действительна.

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

4 голосов
/ 12 марта 2011

Да.В целом, то, что вы пытаетесь сделать, вообще не рекомендуется, но если вам нужно сделать это, сделайте это вместо:

static char str[32];

, что обеспечит его сохранение после выхода из функции.

4 голосов
/ 12 марта 2011

Это действительно вернет висячий указатель.

2 голосов
/ 12 марта 2011

ДА!он вернет указатель на "Привет!"но так как xyz () освободил эту память, вы не можете быть уверены, что строка все еще там, так что это будет висящий указатель!

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