Chciałem zobaczyć, czy mogę zainicjować zmienną globalną zwrócić na siebie:Inicjalizacja danych kołowych w C. Czy ten prawidłowy kod C jest zgodny z jakimkolwiek standardem?
#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;
}
Ten kod kompiluje i działa zgodnie z oczekiwaniami gcc
(wszystkie trzy wskaźniki druku identycznie).
chcę wiedzieć:
- Czy to wiarygodne?
- Czy to standard?
- Czy to jest przenośne?
EDIT: Właśnie w celu wyjaśnienia, mam wątpliwość dostępności adresu x
we własnym inicjatora.
Jest jeden problem: '% p' spodziewa się' void * ', ale argumenty są' struct foo * 's. –
@ DanielFischer nie pozwala C cichym konwersjom zi' void * 'z dowolnego innego wskaźnika, aby umożliwić funkcje, takie jak 'malloc' do pracy bez jawnych konwersji? – Matt
Ma, ale tylko przy zadaniu.Przy przekazywaniu rzeczy do' printf', nie ma takiej konwersji (varargs, bez sprawdzania typu w ogóle). Tak więc 'printf' pobiera 'struct foo *' s, ale ciąg formatu wymaga 'void *'. Twój kompilator powinien Cię o tym ostrzec (jeśli podniesiesz poziom ostrzegawczy). Pedantycznie jest to nawet niezdefiniowane zachowanie, ale będzie działać tak samo, jak na większości popularnych platform (standard nie gwarantuje, że wszystkie wskaźniki mają taką samą wielkość i strukturę, ale zazwyczaj mają). –