Ответ 1
Это действительно нормально. Строковый литерал обычно выделяется в неизменяемой области памяти, которая остается доступной до тех пор, пока ваша программа работает.
См. также ответы на когда c/С++ выделяет строковые литералы.
Я знаю, что это неправильно:
char* getSomething() {
char szLocal[5];
/* put something in the char array somehow */
return szLocal;
}
... потому что szLocal может быть уничтожен когда-то после возвращения функции.
Но это нормально?
char* getSomethingElse() {
return "something else";
}
Это действительно нормально. Строковый литерал обычно выделяется в неизменяемой области памяти, которая остается доступной до тех пор, пока ваша программа работает.
См. также ответы на когда c/С++ выделяет строковые литералы.
Это нормально с точки зрения распределения: строковый литерал неявно static
. Неверно вернуть указатель не const
в литерал.
Если вы хотите вернуть модифицируемую строку (const
), объявите ее static char[]
. Или лучше, верните копию:
return strdup("something else");
Не забывайте free
после. strdup
является не-ISO, но доступен почти везде (за исключением MSVC, я считаю).
Тип строкового литерала (см. комментарии ниже) const char *
static char[]
, но неизменяемый. Строковый литерал представляет собой указатель на статически выделенную память. Поэтому:
Это прекрасно, чтобы вернуть такой указатель.
Тип возвращаемой функции должен должен быть совместим с const char*
, т.е. тип возврата char *
даст вам хотя бы предупреждение может дать вам проблема позже.
Если вы можете возвращать как литерал, так и строку malloc
ed, вы должны быть очень осторожны в управлении памятью. free
Строковый литерал, вероятно, будет segfault.