Ich wollte sehen, ob ich eine globale Variable initialisieren könnte sich Punkt:Initialisieren von zirkulären Daten in C. Ist dieser gültige C-Code gemäß einem 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;
}
Dieser Code kompiliert und ausgeführt wie bei gcc
(alle drei Zeiger Druck identisch) erwartet.
Ich möchte wissen:
- Ist das zuverlässig?
- Ist dieser Standard?
- Ist das tragbar?
EDIT: Nur um zu klären, ich bin die Verfügbarkeit der Adresse x
in seinem eigenen initializer in Frage stellt.
dort ist ein Problem: '% p' erwartet ein' void * ', aber die Argumente sind' struct foo * 's. –
@DanielFischer Erlaubt nicht stille Konvertierungen zu und von' void * 'von irgendeinem anderen Zeiger, um zu erlauben Funktionen wie "malloc", um ohne explizite Konvertierungen zu arbeiten? – Matt
Es tut, aber nur auf Zuweisung. Wenn man Zeug zu 'printf' übergibt, geschieht keine solche Umwandlung (varargs, überhaupt keine Überprüfung). So' printf' bekommt 'struct foo *' s, aber die Formatzeichenfolge benötigt 'void *'. Ihr Compiler sollte Sie davor warnen (wenn Sie die Warnstufe erhöhen). Im Grunde ist das sogar undefiniertes Verhalten, obwohl es auf den meisten gängigen Plattformen funktioniert (der Standard garantiert nicht, dass alle Zeiger die gleiche Größe und Struktur haben, aber normalerweise haben sie). –