Спрашивающий вопрос

char *xyz() { char str[32]; strcpy(str,"Hello there!"); return(str); } void main() { printf("%s",xyz()); } 

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

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

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

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

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

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

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

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

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

 static char str[32]; 

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

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