2016-03-29 7 views
0
#include <stdio.h> 
int a[3] = {1,2,3}; 

void cal(int* item){ 
    printf("Length(inside) is %lu\n", sizeof(item)/sizeof(item[0])); 
} 

int main(){ 
    printf("Length(outside) is %lu\n", sizeof(a)/sizeof(int)); 
    cal(a); 
} 

Der obige Code mit dem Ergebnis kommt, dassZählfeld Länge in c durch Zeiger, die Antwort ist falsch

Length(outside) is 3 
Length(inside) is 2 

Es ist jedoch falsch, weil beide 3 sein sollte, was ist los mit meinem Code?

+2

Die Größe eines Zeigers ist die Größe des Zeigers, nicht was darauf zeigt. Wenn Sie die Länge des Arrays benötigen, müssen Sie es als Argument an die Funktion übergeben. –

Antwort

0

Zunächst einmal sollten Sie Verwenden Sie %zu fomat specifier, um das Ergebnis zu drucken.

Zweitens, wenn an eine Funktion als Argument übergeben, Array-Namen verfällt in den Zeiger auf das erste Element, so dass die sizeof(item) wird nicht funktionieren wie erwartet.

Im Grunde, was Sie tun, ist sizeof (int *)/ sizeof (int) und in Ihrer Umgebung, ist es wahrscheinlich, dass ein Zeiger 8 Bytes belegt und ein int nimmt 4, so dass Sie dieses Ergebnis.

+0

Wörter wie "Verfall" bedeuten für Neophyten nichts, außer man definiert sie spezifisch. –

0

Dies liegt daran, dass das Array in einen Zeiger zerfällt, wenn es an eine Funktion übergeben wird.

Also im Wesentlichen, was Sie tun, ist

sizeof(int*)/sizeof(int); 

Was kann man denken, ist der Unterschied zwischen

int a[5]; 
sizeof(a)/sizeof(a[0]); //this works 

und

int a[5]; 
int* p = a; 
sizeof(p)/sizeof(p[0]); 
+0

Warum zerfällt es? Ich denke, es sollte nicht? Was ist das Problem? –