Ich habe eine Frage darüber, wie Speicher zugewiesen wird, wenn ich calloc
. Ich habe mir die diese Frage angesehen, aber es ist nicht t adressieren, wie Speicher im Falle eines dynamisch zugewiesenen zweidimensionalen Arrays zugewiesen wird.
Ich habe mich gefragt, ob es einen Unterschied in der Speicherdarstellung zwischen den folgenden drei Möglichkeiten gibt, ein 2D-Array dynamisch zuzuordnen.
Typ 1:
%Vor%Typ 2:
%Vor%Typ 3:
%Vor% Nach meinem Verständnis von calloc
und malloc
besteht der Unterschied zwischen den letzten beiden darin, dass calloc
alle Elemente des Arrays auf Null setzt, malloc
hingegen nicht. Aber sind die ersten beiden Möglichkeiten, das Array äquivalent im Speicher zu definieren?
Gibt es die ersten beiden Möglichkeiten, das Array im Speicher zu äquivalent zu machen?
Nicht ganz. In der zweiten Art sind sie fast sicher zusammenhängend, während dies bei der ersten Art nicht sicher ist.
Typ 1: In-Memory-Darstellung sieht wie folgt aus:
%Vor%Typ 2: In-Memory-Darstellung sieht wie folgt aus:
%Vor%In der ersten Weise weisen Sie 10 Zeigern doppelte und 100 doppelte zu. Auf die zweite Art ordnen Sie dem Doppel 100 Zeiger zu. Der andere Unterschied besteht darin, dass Sie auf die zweite Weise einen großen Speicherblock zuweisen, so dass sich alle Elemente Ihres Arrays im selben Block befinden. In der ersten Weise befindet sich jede "Zeile" Ihres Arrays in einem anderen Block als die anderen. In der zweiten Möglichkeit sollte Ihr Array jedoch ein Double * statt eines Double ** sein, da Ihr Array bei dieser Art der Zuweisung nur Pointer enthält, die doppelt sind, nicht doppelt.
Im Fall 1 machen Sie:
%Vor%Hinweis: Sie können nicht davon ausgehen, dass der Speicherbereich kontinuierlich ist, da Lücken bestehen können.
Im Fall 2 machen Sie:
%Vor%Der Fall 3 ist derselbe wie der Fall 2, initialisiert aber nicht den Speicher. Unterschied zwischen Fall 1 und 2 & amp; 3 ist das im ersten Fall haben Sie wirklich 2D-Speicherstruktur. Wenn Sie beispielsweise die Zeilen 1 und 2 vertauschen möchten, können Sie einfach die Zeiger tauschen:
%Vor%Aber wenn du das gleiche im 2 & amp; 3 Fall machen willst, musst du echtes memcpy machen. Was zu verwenden? Hängt davon ab, was du tust.
Der erste Weg verwendet etwas mehr Speicher: Wenn Sie ein Array von 1000x10 hätten, dann würde die erste Version 1000 * 8 + 1000 * 10 * 8 (auf 64-Bit-System) verwenden, während die 2 und 3 nur 1000 * 10 verwenden * 8.