Подтвердить что ты не робот

Возвращает указатель на литеральный (или постоянный) массив символов (строка)?

Я знаю, что это неправильно:

char* getSomething() {  
    char szLocal[5];  
    /* put something in the char array somehow */  
    return szLocal;  
}  

... потому что szLocal может быть уничтожен когда-то после возвращения функции.

Но это нормально?

char* getSomethingElse() {  
    return "something else";  
}  
4b9b3361

Ответ 1

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

См. также ответы на когда c/С++ выделяет строковые литералы.

Ответ 2

Это нормально с точки зрения распределения: строковый литерал неявно static. Неверно вернуть указатель не const в литерал.

Если вы хотите вернуть модифицируемую строку (const), объявите ее static char[]. Или лучше, верните копию:

return strdup("something else");

Не забывайте free после. strdup является не-ISO, но доступен почти везде (за исключением MSVC, я считаю).

Ответ 3

Тип строкового литерала const char * (см. комментарии ниже) static char[], но неизменяемый. Строковый литерал представляет собой указатель на статически выделенную память. Поэтому:

  • Это прекрасно, чтобы вернуть такой указатель.

  • Тип возвращаемой функции должен должен быть совместим с const char*, т.е. тип возврата char * даст вам хотя бы предупреждение может дать вам проблема позже.

  • Если вы можете возвращать как литерал, так и строку malloc ed, вы должны быть очень осторожны в управлении памятью. free Строковый литерал, вероятно, будет segfault.