2016-06-19 3 views
-3

Hier ist die Essenz dessen, was ich zu tun versucht:Warum reserviert malloc() bei Verwendung eines Zeigers auf `double` nicht die richtige Speichergröße?

double *E; //Array of doubles 
int N; //The eventual size of the array, typically >1 

// some code where variable N gets assigned 

//inside of some function 
E = malloc(sizeof(double)*N); 

printf("size of E = %lu\n",sizeof(E)/sizeof(E[0])); //checking size of array E 

Der Ausgang dieses Codes ist „Größe von E = 1“, unabhängig vom tatsächlichen Wert von N. Warum die malloc tut() Funktion nicht die richtige Größe im Speicher zuordnen?

Ich weiß, das scheint sehr rudimentär, aber ich kann nicht verstehen, warum das nicht funktionieren würde.

Jeder Einblick würde sehr geschätzt werden.

+3

'sizeof (E)' ist die Größe des Zeigers. Du kennst die Größe des Arrays bereits, weil du gerade 'malloc' gesagt hast, wie du Speicher willst,' N'. Wenn 'E == NULL', dann ist die Größe '0'. Dies ist eine häufig gestellte Frage. –

+0

In einem verwandten Hinweis sollten Sie immer "Calloc" für diese Art von Fällen verwenden. –

+0

@ Rhymoid für was "Art von Fall"? Willst du sagen, Malloc sollte nicht benutzt werden? –

Antwort

2

Sie teilen die Größe des Zeigers im Wesentlichen durch die Größe eines Double. Beide nehmen die gleiche Menge an Bytes (8 typischerweise) zum Speichern. daher erhalten Sie 1.

+0

Danke, ich habe die Verwendung der Funktion sizeof() einfach missverstanden. Es scheint, dass es eine Menge Verwirrung darüber gibt, wie ich viele Beiträge wie diese sah (http://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my- array-in-c), die angibt, dass sizeof() die Länge des Arrays angibt, auf das gezeigt wird. –

1

E ist Typ Zeiger auf doppelte. Der Wert von E ist eine Adresse. Wenn Sie die Größe von (E) erhalten, erhalten Sie die Größe der Variablen, die der Zeiger ist, und nicht die Größe dessen, worauf die Variable zeigt. Um die Größe von dem, was malloc zu bekommen, müssen Sie den Zeiger dereferenzieren in sizeof so Ihre letzte Zeile wird:

printf("size of E = %lu\n",sizeof(*E) * N/sizeof(E[0])); 

EDIT

Es gibt keinen Unterschied zwischen * E und E [0] wie in einem der Kommentare angegeben. In C gibt es keine Möglichkeit zu wissen, wo das Array endet, weil das Array selbst als Datentyp seine Länge nicht speichert. Dies ist teilweise der Grund, warum der Vektor-Datentyp in C++ notwendig war.

Da Sie bereits die Länge des Arrays in N gespeichert haben, können Sie auch einfach N drucken. Wenn Sie das Array an irgendwelche Funktionen übergeben, übergeben Sie das Array zusammen mit der Länge. Mit Strings können Sie das Zeichen-Array durchlaufen, bis Sie das Null-Zeichen '\ 0' erhalten. Für Integer- und Fließkomma-Datentyp-Arrays gibt es keine solche Konvention.

+2

Werden 'sizeof * E' und' sizeof E [0] 'jemals anders sein? –

+0

@WeatherVane Ich glaube nicht. – Schwern

+0

@Schwern naja ich hätte es nicht als Frage formuliert. Text fehlt Intonation. –

0

malloc reserviert ein Array mit der richtigen Größe, sonst ist Ihr Test falsch.

sizeof (E) ist die Größe des Zeigers = 8

sizeof (* E) ist die Größe des ersten Doppel = 8

Sie die Größe Ihrer Array multipliziert sizeof wissen können (* E) * N

0

Um diese Erklärung noch weiter zu drehen, wenn sizeof(E) wie erwartet funktioniert (geben Sie die Größe des zugewiesenen Speichers und nicht die Größe des Zeigers an), können Sie diese verwenden, um die Größe dynamisch zu ermitteln zugewiesene Arrays. Das ist in C nicht möglich.