¿Cuál es la vida útil de los literales de cuerdas en C?

¿Cuál es la vida útil de los literales de cadena "zero" y "non-zero" en el siguiente progtwig?

 #include  #include  const char* tester(int inp) { const char *retval=NULL; if (inp==0) retval="zero"; else retval="non-zero"; return retval; } int main() { const char *outval=NULL; outval=tester(0); printf("0 is %s\n",outval); outval=tester(1); printf("1 is %s\n",outval); return EXIT_SUCCESS; } 

Sé por esta pregunta en la lista de Preguntas Frecuentes de C que "zero" y "non-zero" son (o al menos se permite que sean) de solo lectura. Supongo que es por eso que tuve que poner las const antes de las declaraciones char* para detener las advertencias del comstackdor acerca de “… descartar el calificador” const ‘… “. Pero mientras el progtwig da el resultado esperado de

0 es cero

1 no es cero

También sé que el tester no se puede definir como:

 char* tester(int inp) { char retval[9]; if (inp==0) strcpy(retval,"zero"); else strcpy(retval,"non-zero"); return retval; } 

debido a que se debe suponer que se eliminará el valor de la matriz cuando el tester salga.

Entonces, ¿puedo hacer lo que he hecho en el código original o debo usar malloc ?

Los literales de cadena tienen una duración de almacenamiento estático (es decir, su tiempo de vida es el tiempo de ejecución del progtwig).

Ver §6.4.5 / 6 de la norma C.