devolviendo un puntero a una matriz de caracteres literal (o constante) (cadena)?

Sé que esto está mal:

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

… porque szLocal puede ser destruido en algún momento después de que la función regrese.

Pero esta bien?

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

Eso está realmente bien. La cadena literal generalmente se asigna en un área de memoria inmutable que permanece disponible durante el tiempo que se ejecuta el progtwig.

Vea también las respuestas de cuándo c / c ++ asigna literales de cadena .

Está bien en términos de asignación: la cadena literal es implícitamente static . No está bien devolver un puntero no const a un literal.

Si desea devolver una cadena modificable (no const ), declare que es un static char[] . O mejor, devuelve una copia:

 return strdup("something else"); 

No te olvides de free después. strdup no es ISO pero está disponible en casi todas partes (excepto MSVC, creo).

El tipo de una cadena literal es const char * (ver comentarios más abajo) static char[] , pero inmutable. Un literal de cadena representa un puntero a la memoria asignada estáticamente. Por lo tanto:

  1. Está perfectamente bien, devolver un puntero tal.

  2. El tipo de retorno de su función debe ser compatible con const char* , es decir, el tipo de retorno char * le dará al menos una advertencia que le puede dar problemas más adelante.

  3. Si su función puede devolver una cadena literal o malloc , debe tener mucho cuidado con la administración de la memoria. la liberación de una cadena literal probablemente se segfault.