warum funktioniert malloc (sizeof (pointer))?

8

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?

    
Bharat Kul Ratan 31.07.2012, 17:07
quelle

4 Antworten

10

Sie haben hier ein undefiniertes Verhalten.

malloc wird 8 Bytes zuweisen (wie Sie sagen), aber dieser Cast ist "schlecht":

%Vor%

Nach dieser Zeile zeigt ptr auf einen Speicherblock, der nur 8 zugewiesene Bytes hat, der Rest sind einige "zufällige" Bytes. Also, machen

%Vor%

Sie ändern tatsächlich etwas Speicher, nicht nur das von malloc zugewiesene.

Mit anderen Worten, Sie schreiben Speicher neu, Sie sollten nicht berühren.

    
Kiril Kirov 31.07.2012, 17:10
quelle
8

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:

%Vor%

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.

    
pb2q 31.07.2012 17:10
quelle
3

malloc reserviert nur 8 Bytes, aber das hindert Sie nicht daran, darüber hinaus auf den Speicher zuzugreifen. Sie werden wahrscheinlich den Heap verfälschen und könnten über andere Objekte schreiben. Das Verhalten des Programms ist nicht definiert.

    
jarmond 31.07.2012 17:11
quelle
2

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.

    
Eight 31.07.2012 17:12
quelle

Tags und Links