quería ver si podía inicializar una variable global para apuntar a sí mismo:Inicializando datos circulares en C. ¿Este código C es válido según cualquier estándar?
#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 esperaba con gcc
(todo de impresión de tres puntos de forma idéntica).
Quiero saber:
- Esto es confiable?
- ¿Es este estándar?
- ¿Es esto portátil?
EDIT: Solo para aclarar, estoy cuestionando la disponibilidad de la dirección de x
en su propia inicializador.
Hay un problema: '% p' espera un' void * ', pero los argumentos son' struct foo * 's. –
@DanielFischer Does not C permite conversiones silenciosas desde y hacia' void * 'desde cualquier otro puntero para permitir funciones como 'malloc' para trabajar sin conversiones explícitas? – Matt
Lo hace, pero solo en la asignación. Cuando pasa cosas a' printf', no ocurre tal conversión (varargs, sin verificación de tipo en absoluto). Así 'printf' obtiene 'struct foo *' s, pero la cadena de formato requiere 'void *'. Tu compilador debería advertirte sobre eso (si subes el nivel de advertencia). Pedante, eso es incluso un comportamiento indefinido, aunque funcionará según lo previsto en la mayoría de las plataformas comunes (el estándar no garantiza que todos los punteros tengan el mismo tamaño y estructura, pero por lo general lo tienen). –