Управление памятью: область видимости и локальная переменная указателя
В. Что касается ошибки управления памятью, что является ошибкой в следующем коде?
char* secret_message()
{
char message_buffer[100];
char* text = "Hey man!";
int n = 0;
while (text[n] != '\0')
n++;
for (int i = 0; i <= n ; i++)
message_buffer[i] = text[i];
return message_buffer;
}
Ответ.
Я думаю, что message_buffer является локальной переменной
это автоматически восстанавливается после завершения функции.
Эта функция возвращает ссылку на неверную ячейку памяти
, поскольку message_buffer исчезает сразу после оператора return.
Это правильно?
Пожалуйста, дайте мне знать.
Спасибо,
Ответ. Я думаю, что message_buffer — это локальная переменная, которая автоматически восстанавливается после завершения функции. Эта функция возвращает ссылку на недопустимую ячейку памяти, поскольку message_buffer исчезает сразу после оператора return.
Да, это правильно. message_buffer
находится в стеке, его память будет освобождена при выходе из функции. указатель будет указывать на освобождение памяти.
КСТАТИ:
char* text = "Hey man!";
должно быть
const char* text = "Hey man!";
в современном C ++.
message_buffer — это автоматическая переменная, область действия которой находится только внутри функции.
эта переменная либо должна быть объявлена в основной функции, либо объявлена как статическая переменная внутри функции.
Ты прав. Это приводит к неопределенному поведению.