Definieren einer Struktur in C mit Malloc

7

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))

sein

Danke für jede Hilfe

    
Blackbinary 01.02.2010, 16:58
quelle

4 Antworten

19

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.

    
VoidPointer 01.02.2010, 17:06
quelle
19

Der sizeof -Operator evaluiert seinen Operanden nicht wirklich - er betrachtet nur seinen Typ. Dies geschieht zur Kompilierungszeit anstatt zur Laufzeit. So kann es sicher ausgeführt werden, bevor die Variable zugewiesen wurde.

    
interjay 01.02.2010 17:00
quelle
1

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

Typnamen angeben %Vor%

und nicht bei Objekten, wir tun einfach:

%Vor%

Siehe den Standard:

  

6.5.3 Unäre Operatoren Syntax

%Vor%     
dirkgently 01.02.2010 17:09
quelle
0

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".

    
Alok Singhal 01.02.2010 17:13
quelle

Tags und Links