Возврат локально созданного const char * - PullRequest
0 голосов
/ 28 июня 2018
#include <iostream>


const char* fun()
{
    const char* x = "abc";
    std::cout << "x = " << x << "\n";
    return x;
}


int main(int arc, char** argv)
{
    const char* y = fun();
    std::cout << "y = " << y << "\n";
    return 0;
}

Запуск этого на моей машине дает:

x = abc

y = abc

В fun(), x (локальная переменная) назначается адрес строкового литерала, созданного локально, но когда функция возвращает, данные, на которые указывает y, совпадают с указанными на x, хотя x выходит за рамки.

Может кто-нибудь подробно объяснить, что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Как вам функция fun

const char* fun(){
    const char* x = "abc";
    std::cout << "x = " << x << "\n";
    return x;
}// the pointer returns but it's content still alive, because it points to string literal

Если вы измените функцию fun на следующую:

const char* fun(){
    char x[] = "abc";
    std::cout << "x = " << x << "\n";
    return x;
}// the pointer returns but it's content died

, то:

const char* y = fun();
std::cout << "y = " << y << "\n"; 

вывод, как и ожидалось (у '' '):

enter image description here

Поскольку вышеприведенный const char* x = "abc"; не является локальной переменной, это string literal, который имеет статическую продолжительность хранения и существует в течение всей жизни программы.

На противоположном char x[] = "abc"; - локальная переменная, которая погибнет, когда выйдет из области видимости.

0 голосов
/ 28 июня 2018

Это правильно, возвращаемый указатель действителен и не болтается; потому что строковый литерал (т. е. "abc") имеет статическую продолжительность хранения и существует в течение всей жизни программы.

Строковые литералы имеют статическую длительность хранения и, таким образом, существуют в памяти на весь срок действия программы.

Как вы сказали, когда функция возвращает локальную переменную, x уничтожается, но строковый литерал, на который она указывает, - нет.

...