Dieser folgende Code funktioniert einwandfrei:
%Vor%Wenn erfüllt als:
%Vor%Meine Frage ist: Warum ist das in Ordnung?
malloc
weist die Anzahl der Bytes zu, die in seinem Argument angegeben sind. Hier ist sizeof ptr
8 Bytes auf meinem 64-Bit Linux-Rechner. Ich dachte malloc
wird 8 Bytes zur Verfügung stellen, aber wie greift es dann auf alle Variablen a, b, c, d, e? Geht es nur mit gcc oder fehlt mir etwas mit Standard C?
Soweit ich weiß, sollte "Line 2" anstelle von "Line 1" da sein, aber beide Zeilen funktionieren einwandfrei. Warum?
Sie haben hier ein undefiniertes Verhalten.
malloc
wird 8 Bytes zuweisen (wie Sie sagen), aber dieser Cast ist "schlecht":
Nach dieser Zeile zeigt ptr
auf einen Speicherblock, der nur 8 zugewiesene Bytes hat, der Rest sind einige "zufällige" Bytes. Also, machen
Sie ändern tatsächlich etwas Speicher, nicht nur das von malloc
zugewiesene.
Mit anderen Worten, Sie schreiben Speicher neu, Sie sollten nicht berühren.
Zeile 1 ist falsch und wird nicht genügend Speicherplatz zuweisen. Wenn Sie später auf die Strukturelemente zugreifen können, geschieht dies nur, weil C nichts daran hindert, auf den Speicher zuzugreifen, der Ihnen nicht gehört.
Der Zugriff auf ptr->b
, ptr-c
usw., wenn Sie nicht genügend Speicherplatz für die gesamte Struktur zugewiesen haben, ist ein undefiniertes Verhalten, und beim nächsten Ausführen des Codes kann es zum Absturz kommen, oder Sie könnten am Ende überschrieben werden Daten in einem anderen Teil Ihres Programms.
Um das Problem zu demonstrieren, weisen Sie unmittelbar nach dem ersten ein zweites struct node
zu. Dies ist nicht garantiert , um das Problem zu demonstrieren, aber Sie sehen wahrscheinlich ähnliche Ergebnisse wie die folgenden:
Ausgabe:
%Vor% Beachten Sie, dass ptr->e
durch die Zuweisung zu ptr2->a
geändert wurde, sodass Sie sehen können, dass eine unsachgemäß zugewiesene Struktur auf den Speicher eines anderen zugreift. Das ist sicherlich nicht das, was du willst.
In ptr->a = 1; ptr->b = 2; ptr->c = 3; ptr->d = 4; ptr->e = 5;
greifen Sie über den vom malloc zugewiesenen Speicher hinaus.
Dies ist ein Fall von Pufferüberlauf und verursacht undefined behaviour
.
Es ist möglich, weil
%Vor%Es kann also irgendwann funktionieren, manchmal kann es auch das Programm zum Absturz bringen.