standard quimica iec c18 acorde c c99 c11

quimica - Vida útil de los objetos temporales en C11 vs C99



gnu c11 (1)

Mi entendimiento es que en C99, el mejor grano de vida para un objeto es el bloque. Por lo tanto, mientras que 6.5.2.2 (y algún otro § mencionado en la nota a la que hace referencia) dice específicamente que no puede acceder al valor devuelto después del siguiente punto de secuencia, técnicamente su dirección no es indeterminada hasta después de que haya abandonado el bloque que la contiene. (Sin embargo, la razón por la que debería tener algún almacenamiento reservado para un objeto inaccesible se deja como un ejercicio para el lector). Así, algo como

struct X { int a[5]; } f(); int *p; { p = f().a; } printf("%p/n", p);

No está definido en C99 como en C11. En C11, la noción de "tiempo de vida temporal", que no existe en C99, permite considerar que el puntero se vuelve indeterminado tan pronto como termina la expresión completa.

Estoy tratando de descifrar una nota que llevó a un cambio entre C99 y C11. El cambio propuesto en esa nota terminó en 6.2.4: 8 de C11, a saber:

Una expresión sin valor con estructura o tipo de unión, donde la estructura o unión contiene un miembro con tipo de matriz (incluidos, recursivamente, los miembros de todas las estructuras y uniones contenidas) se refiere a un objeto con duración de almacenamiento automático y duración temporal. Su tiempo de vida comienza cuando la expresión se evalúa y su valor inicial es el valor de la expresión. Su duración finaliza cuando finaliza la evaluación de la expresión completa contenedora o del declarador completo. Cualquier intento de modificar un objeto con una duración temporal da como resultado un comportamiento no definido.

Entiendo por qué fue necesario el cambio (se puede encontrar algo de discusión here . Tenga en cuenta que la discusión se remonta al C11 anterior). Sin embargo, lo que no entiendo es una observación lateral que Clark Nelson hizo al escribir su nota:

Tenga en cuenta que este enfoque además declara que un ejemplo como este, que estaba conforme con C99, no es conforme:

struct X { int a[5]; } f(); int *p = f().a; printf("%p/n", p);

Entiendo por qué este ejemplo no es conforme con C11. Lo que específicamente no entiendo es cómo cumple con C99. Y, si se define en C99, ¿qué se supone que debe hacer entonces, imprimir de forma definida el valor de un puntero colgante?