Volevo vedere se riuscivo a inizializzare una variabile globale per puntare a se stesso:Inizializzazione di dati circolari in C. Questo codice C valido è conforme a qualsiasi standard?
#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;
}
Questo codice viene compilato ed eseguito come previsto con gcc
(tutti e tre puntatori di stampa in modo identico).
Voglio sapere:
- È questo affidabile?
- È questo standard?
- È portatile?
EDIT: Giusto per chiarire, io sono in discussione la disponibilità dell'indirizzo di x
nella propria inizializzazione.
C'è un problema: '% p' si aspetta un' void * ', ma gli argomenti sono' struct foo * 's. –
@DanielFischer Non C consente le conversioni silenziose da e verso' void * 'da qualsiasi altro puntatore per consentire funzioni come 'malloc' per funzionare senza conversioni esplicite? – Matt
Lo fa, ma solo su assegnamento. Passando roba a' printf', non avviene alcuna conversione (varargs, nessun tipo di controllo). ottiene 'struct foo *' s, ma la stringa di formato richiede 'void *'. Il compilatore dovrebbe avvertirti di questo (se si attiva il livello di avviso). Pedanticamente, anche questo comportamento è indefinito, anche se funzionerà come previsto sulle piattaforme più comuni (lo standard non garantisce che tutti i puntatori abbiano le stesse dimensioni e struttura, ma di solito lo hanno). –