gcc 4.4.1 c89
Ich habe das folgende Code-Snippet:
%Vor%Die Größe von (Puffer) wird jedoch immer gedruckt 4. Ich weiß, dass ein Zeichen * nur 4 Byte ist. Allerdings habe ich den Speicher für 10kb reserviert. Sollte also nicht die Größe 10240 sein? Ich frage mich, denke ich gerade hier?
Vielen Dank für Anregungen,
Sie fragen nach der Größe eines char*
, was tatsächlich 4 ist, nicht die Größe des Puffers. Der Operator sizeof
kann die Größe eines dynamisch zugewiesenen Puffers nicht zurückgeben, sondern nur die Größe der statischen Typen und Strukturen, die zur Kompilierungszeit bekannt sind.
sizeof
funktioniert nicht bei dynamischen Zuordnungen (mit einigen Ausnahmen in C99). Ihre Verwendung von sizeof
hier gibt Ihnen nur die Größe des Zeigers. Dieser Code gibt Ihnen das gewünschte Ergebnis:
Wenn malloc()
erfolgreich ist, ist der angezeigte Speicher mindestens so groß, wie Sie gefragt haben. Es gibt also keinen Grund, sich um die tatsächliche Größe zu kümmern, die zugewiesen wurde.
Außerdem haben Sie 10 kB zugewiesen, nicht 1 kB.
Es liegt an Ihnen, die Speichergröße zu verfolgen, wenn Sie sie benötigen. Der von malloc zurückgegebene Speicher ist nur ein Zeiger auf "nicht initialisierte" Daten. Der Operator sizeof arbeitet nur an der Variablen buffer
.
Nein. buffer
ist ein char *
. Es ist ein Zeiger auf char
data. Der Zeiger benötigt nur 4 Bytes (auf Ihrem System).
Es zeigt auf 10240 Bytes von Daten (das ist übrigens nicht 1 KB. Mehr wie 10 KB), aber der Zeiger weiß das nicht . Überlegen Sie:
%Vor% Es ist der Hauptunterschied zwischen Arrays und Zeigern. Wenn dies nicht funktioniert, ändert sich sizeof p
im obigen Code, was für eine Kompilierzeitkonstante nicht sinnvoll ist.