nodo - Inicialización de datos circulares en C. ¿Es este código C válido de acuerdo con alguna norma?
insertar nodo en lista circular c++ (2)
Este es el código C estándar.
Este párrafo de la poderosa Norma lo permite (énfasis mío):
(C99, 6.2.1p7) "Las etiquetas de estructura, unión y enumeración tienen un alcance que comienza justo después de la aparición de la etiqueta en un especificador de tipo que declara la etiqueta. Cada constante de enumeración tiene un alcance que comienza justo después de la aparición de su enumerador definidor. en una lista de enumeradores. Cualquier otro identificador tiene un alcance que comienza justo después de completar su declarador " .
Para información, tenga en cuenta que para ilustrar la última oración de 6.2.1p7, el libro "The New C Standard" de Derek M. Jones usa un ejemplo similar al suyo:
struct T {struct T *m;} x = /* declarator complete here. */ {&x};
Quería ver si podía inicializar una variable global para señalarse a sí misma:
#include <stdio.h>
struct foo { struct foo *a, *b; } x = { &x, &x };
int main()
{
printf("&x = %p, x.a = %p, x.b = %p/n", &x, x.a, x.b);
return 0;
}
Este código se compila y se ejecuta como se espera con gcc
(los tres punteros se imprimen de manera idéntica).
Quiero saber:
- ¿Es esto confiable?
- ¿Es esta norma?
- ¿Esto es portátil?
EDIT: Solo para aclarar, estoy cuestionando la disponibilidad de la dirección de x
en su propio inicializador.
Sí a todo lo anterior. Tiene un par de punteros que está inicializando con la misma dirección, por lo que tienen la misma dirección, y esa es la misma dirección con la que los inicializó.
Quizás lo más interesante es que a xa
también se le garantiza apuntarse a sí mismo (es decir, se garantiza que el primer elemento en una estructura esté al principio de la estructura, por lo que un puntero a la estructura, convertido al tipo del primer elemento, es Garantizado para apuntar a ese primer elemento.