Ich habe eine Frage zum Definieren einer Struktur mit malloc gestellt . Dies war die Antwort, die mir von der Mehrheit gegeben wurde:
%Vor% Ich zeigte einem Freund meinen Code und wir kamen zu einem Stolperstein.
Könnte jemand bitte erklären, warum dieser Code funktioniert?
Aus meiner Sicht ist * st bei der Mallokation nicht definiert worden, also könnte es dort irgendeinen Müll geben. Es sollte malloc(sizeof(struct retValue))
Danke für jede Hilfe
Sizeof sieht sich den Typ des Ausdrucks an, der ihm gegeben wird, evaluiert den Ausdruck nicht. Daher müssen Sie nur sicherstellen, dass die im Ausdruck verwendeten Variablen deklariert sind, damit der Compiler ihren Typ ableiten kann.
In Ihrem Beispiel ist st bereits als Zeiger-zu-Struktur-RetWert deklariert. Folglich ist der Compiler in der Lage, den Typ des Ausdrucks "* st" abzuleiten.
Obwohl es nicht so aussieht, als wäre es bereits in Ihrem Code deklariert, hat der Compiler es bereits für Sie erledigt. Alle Deklarationen in Ihrem Code werden an den Anfang des Blocks verschoben, in dem sie vom Compiler vorkommen. Angenommen, Sie schreiben
Eine Möglichkeit, das dem Compiler zur Verfügung stehende Wissen zu veranschaulichen, besteht darin, die von ihm generierte Zwischenausgabe zu betrachten. Betrachten Sie diesen Beispielcode ...
%Vor%Wenn Sie gcc als Beispiel verwenden und den obigen Code in der Funktion main () von test.c sehen, schauen wir uns die Zwischenausgabe an, indem Sie ...
%Vor%Der Compiler wird die Datei test.c022t.cfg generieren - Schau sie dir an und du wirst
sehen %Vor%Beachten Sie, wie die Deklaration an den Anfang des Blocks verschoben wurde und das Argument für malloc bereits durch den tatsächlichen Wert ersetzt wurde, der die Größe des Typs angibt, für den der Ausdruck ausgewertet wurde. Wie in den Kommentaren erwähnt, ist die Tatsache, dass die Deklaration an den Anfang des Blocks verschoben wurde, ein Implementierungsdetail des Compilers. Die Tatsache, dass der Compiler in der Lage ist, dies zu tun und auch die korrekte Größe in das malloc einzufügen, zeigt jedoch, dass der Compiler in der Lage war, die notwendigen Informationen aus der Eingabe abzuleiten.
Ich persönlich bevorzuge es, den tatsächlichen Typnamen als Parameter für sizeof anzugeben, aber das ist wahrscheinlich eine Frage des Coding-Stils, wo ich sagen würde, dass Konsistenz die persönliche Präferenz übertrifft.
Entscheidend ist die Deklaration / Definition des Strukturtyps und nicht die Definition eines Objekts einer solchen Klasse. Zu dem Zeitpunkt, zu dem Sie malloc
erreichen, wird eine Deklaration / Definition vom Compiler gefunden, andernfalls würden Sie einen Compilerfehler bekommen.
Die Tatsache, dass sizeof
seine Operanden nicht auswertet, ist ein Nebenproblem.
Eine kleine Nit: Denken Sie daran, dass Klammern sind, wenn wir sizeof
wie in
und nicht bei Objekten, wir tun einfach:
%Vor%Siehe den Standard:
%Vor%6.5.3 Unäre Operatoren Syntax
In% ist sizeof
ein Operator und wertet sein Argument nicht aus. Das kann zu "interessanten" Effekten führen, die jemand, der neu in C ist, nicht unbedingt erwartet. Ich erwähnte das genauer in meine Antwort auf die Frage "Merkwürdigste Sprache".