2016-05-13 12 views
3

Ich habe eine struct definiert:Dynamisch Zeiger falsche Größe auf int geben

struct Query { 
    int *pages; 
    int currentpage; 
}; 


struct Query *new = malloc(sizeof(struct Query)); 

new->pages = malloc(sizeof(int) * 4); 

Ich habe dann die Größe von new->pages, um sicherzustellen, dass die Größe betrug 4 by doing:

int size = sizeof(new->pages)/sizeof(new->pages[0]); 

jedoch size wird 2 im Gegensatz zu 4 zurückgegeben.

Würde jemand wissen, was ich falsch machen könnte?

Danke für Ihre Hilfe.

+5

'sizeof (neuen-> Seiten)/sizeof (neuen-> Seiten [0])' 'gemeint sizeof (int *)/sizeof (int)' ' – BLUEPIXY

+2

pages' ein' pointer' ist, nicht ein 'Array'. Sie sagen: Geben Sie mir die Größe eines Zeigers geteilt durch die Größe eines 'int' (was in den meisten Systemen 8/4 = 2 ist). – nicola

+2

Ich würde vorschlagen, dass Sie dritte Elementvariable in Ihrer Struktur hinzufügen, wo Sie die Elementanzahl speichern. – user694733

Antwort

8

Ihre Erwartungen sind falsch.

sizeof(new->pages) in

int size = sizeof(new->pages)/sizeof(new->pages[0]); 

nicht die Gesamtzahl der Elemente int zurückzukehren. Nur die Größe des int-Zeigers (int*). Da sizeof(int*) 8 und sizeof(int) 4 auf Ihrer Plattform, gibt es 2.

By the way, sollten Sie size_t für size als sizeof verwenden Bediener ein size_t zurückgibt und %zu ist die Formatangabe (in printf()) size_t zu drucken.

+0

Können 'sizeof (int *)' 4 und 'sizeof (int)' 2 auf ihrer Plattform nicht von dem sein, was wir wissen? – nicola

+0

Ja, es ist möglich, aber sehr unwahrscheinlich, dass es heutzutage einen vernünftigen Compiler gibt (außer es ist der veraltete Turbo C Compiler). Theoretisch ist es sogar gültig, 16 bzw. 8 zu sein. –

2

Sie sehen dies, weil der Operator sizeof die Größe des Typs seines Operanden in Byte angibt und der Typ new->pages ein Zeiger auf Ganzzahl ist, wie von der Struktur definiert, so wird die Größe des Zeigers ausgewertet und nicht das Array.

Hinweis der Unterschied am Beispiel:

int arr[4] = {0,1,2,3}; 
int *p = arr; 
printf("%zu\n", sizeof(arr)); // prints 16 
printf("%zu\n", sizeof(p)); // prints 4 

Die Konvention Anzahl der Elemente eines Arrays des Erhaltens sizeof(arr)/sizeof(arr[0]) funktioniert nur auf Arrays verwendet wird, ist es nicht auf Zeiger funktioniert, müssen Sie die Länge verfolgen auf dein eigenes.

0

Zeiger sind keine Arrays. Obwohl der Zeiger auf ein Array zeigen kann, gibt die Anwendung des Operators sizeof() auf einen Zeiger die Größe des Zeigers zurück, nicht die Größe des Arrays, auf das er zeigt.

Also, um die Größe zu verfolgen, empfehle ich, dass Sie eine Variable des Typs size_t verwenden, um den Wert (Größe) zu speichern.

Oh ja, und nennen Sie keine Ihrer Variablen new, falls Sie einen C++ Compiler verwenden möchten!

struct Query { 
    int *pages; 
    int currentpage; 
}; 

size_t size = 4; 

struct Query *p = malloc(sizeof(struct Query)); 

p->pages = malloc(sizeof(int) * size); 
Verwandte Themen