Чем char [] и char * отличаются в этом случае? - PullRequest
1 голос
/ 17 сентября 2011

Когда мы запускаем этот кусок кода, он работает нормально и печатает string constant на экране:

char *someFun(){
    char *temp = "string constant";
    return temp;
}
int main(){
    puts(someFun());
}

Но когда мы запускаем следующий подобный код, он не будет работать и выводит на экран какую-то фигню:

char *someFun1(){
    char temp[ ] = "string";
    return temp;
}
int main(){
    puts(someFun1());
}

В чем причина этого? По сути, обе функции делают схожие вещи (то есть возвращают «строку»), но, тем не менее, они ведут себя по-разному. Почему это так?

Ответы [ 2 ]

5 голосов
/ 17 сентября 2011
char *temp = "string constant";

string constant литерал находится в сегменте только для чтения. Он освобождается при завершении программы. Таким образом, вы можете иметь ссылку, указывающую на это.

char temp[ ] = "string";

string копируется в temp, который находится в стеке. Когда функция возвращается, начинается разматывание стека, что приводит к удалению переменных в области действия функции. Но вы возвращаете ссылку на него, которого больше нет в стеке, и, следовательно, вы получаете мусор. Но иногда вы все равно можете получить правильный результат, но вам не следует полагаться на него.

3 голосов
/ 17 сентября 2011

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

Во втором случае «string» - это просто массив символов в стеке, который умирает после возврата из функции.

...