Calloc mit Struktur mit Zeigern in C
Ich weiß, dass calloc Anfrage-Speicher verwendet werden, schreibt 0 auf alle bits und gibt dann einen Zeiger darauf.
Meine Frage ist: wenn ich mit calloc mit einer Struktur, die Zeiger enthält, werden diese Zeiger haben den Wert NULL oder muss ich auf Punkt NULL?
struct a{
char * name;
void * p;
}* A;
Also im Grunde, wird name-und p-Punkt, zu NULL, nachdem ich verwendet habe, calloc, mit struct ein?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Irgendwie haben Sie bekommen sehr viele falsche Antworten. C nicht erforderlich, die Darstellung der null-Zeiger auf null-bits. Viele Menschen fälschlicherweise denken, es tut, da ein ganzzahliger konstanter Ausdruck mit Wert 0, umgewandelt in einen Zeiger, wird ein null-Zeiger.
Mit dieser sagte, auf alle Systeme der realen Welt, null-Zeiger sind alle null-bits, und
calloc
ist ein durchaus vernünftiger Weg zu einem null-Zeiger initialisiert Zeiger-array in der realen Welt.if (ptr)
, nicht das, was die Maschine zu tun hat. Dies ist völlig bis an den compiler, aber die Unterstützung für mehrere alias-Namen für die null-pointer wird eine riesige Verschwendung von Zeit und hat keinen nutzen.R.'s Antwort ist gut, aber ich möchte noch hinzufügen, dass die standard-Anführungszeichen um dies zu unterstützen, und zeigen Sie eine Möglichkeit auf 0 initialisieren Ihrer Struktur, die funktioniert, in der Tat, die Ausbeute NULL-Zeiger.
Vom N1548 (C11 Entwurf)
Die Fußnote sagt dann (Hervorhebung Hinzugefügt):
Während ein null-Zeiger ist in der Regel vertreten als alle 0-bits, diese Darstellung ist nicht garantiert. Zur Beantwortung Ihrer Frage direkt, keine verlassen Sie sich nicht auf die
calloc()
'd-struct s Zeiger zuNULL
.Wenn Sie wollen, um alle enthaltenen Zeiger einen dynamisch zugewiesenen struct zu
NULL
können Sie die folgenden verwenden:C11:
und
C erfordert, dass Sie mindestens ein element innerhalb der Klammern, das ist, warum ich
{0}
statt{}
. Der rest der Elemente initialisiert werden gemäß der oben genannten Regeln, Ergebnisse, die in null-Zeiger. Soweit ich das beurteilen kann, die Regeln dafür sind die gleichen wie im C11 und C99.Dem ISO-C-standard für
calloc
es erfordert zu initialisieren alles auf0
. Das bedeutet, dass, wenn Sie am Ende veiwing Speichercalloc
als Zeiger, wird es in der Tat zunächst enthalten NULL (0) Zeiger.