¿Qué es la vida útil de un valor de retorno de función?

Leí sobre elreturn valores entre llamadas a funciones,
y experimenté con el siguiente fragmento de código:

/* file structaddr.c */
#include <stdio.h>    
#define MSIZE 10

struct simple
{   
    char c_str[MSIZE];
};
struct simple xprint(void)
{
    struct simple ret = { "Morning !" };
    return ret;
}
int main(void)
{   
    printf("Good %s\n", xprint().c_str);    
    return 0;
}

El código se compila sin errores y advertencias.
Probado conGCC 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) yVisual C ++ compiladores

 gcc -m32 -std=c99 -Wall -o test  structaddr.c  
 cl -W3 -Zi -GS -TC -Fetest structaddr.c

Salida:
Buenos días !

Estoy un poco confundido por el resultado.
El código está escrito correctamente?

Mi pregunta :

¿Cuál es la visibilidad de la función?return valor (matriz de unstruct en el ejemplo anterior), y cómo acceder adecuadamente a ellos?

Donde termina la vida de unreturn valor?

Respuestas a la pregunta(2)

Su respuesta a la pregunta