возвращать указатель на литеральный (или постоянный) массив символов (строку)? - PullRequest
27 голосов
/ 29 января 2011

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

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

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

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

Ответы [ 3 ]

25 голосов
/ 29 января 2011

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

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

7 голосов
/ 29 января 2011

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

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

return strdup("something else");

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

4 голосов
/ 29 января 2011

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

  1. Совершенно нормально возвращать такой указатель.

  2. Ваша функция возвращает тип must быть совместимым с const char*, т. е. тип возврата char * даст вам как минимум предупреждение может вызвать проблемы позже.

  3. Если вы можете работать,верните литеральную или malloc ed строку, вы должны быть очень осторожны с управлением памятью.free использование строкового литерала, вероятно, приведет к ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...