2016-08-08 72 views
-1

sizeof (Array_Name) gibt bei Verwendung in side main function die Anzahl der Bytes dieses Arrays zurück, während es innerhalb einer benutzerdefinierten Funktion verwendet wird rettet die Größe des Zeigers (und zwar weil er an die Funktion als Zeiger übergeben wird).sizeof (Array_Name) innerhalb der Hauptfunktion VS sizeof (Array_Name) innerhalb einer benutzerdefinierten Funktion

Meine Frage ist, warum, wenn sizeof (Array_Name) in main verwendet wird, wird es nicht als ein Zeiger behandelt?

+0

In Verbindung stehende: http://Stackoverflow.com/q/492384/694576 – alk

Antwort

0

Dies liegt daran, dass Array-Namen in Zeiger zerfallen, wenn sie an Funktionen übergeben werden. Zum Beispiel

int main() 
{ 
    int arr[3] = { 1, 2, 3 }; 
    printf("main: %zu\n", sizeof(arr)); 

    f(arr); 
} 
void f(int *ptr) 
{ 
    printf("%zu", sizeof(ptr)); 
} 

Ausgang:

main: 3 * sizeof(int) 
f: sizeof(int *) 

auch (Wo sizeof... mit dem Ist-Wert auf Ihrem Compiler ersetzt wird), tut es davon ab, ob die Anordnung in main deklariert wird oder nicht . Diese Regel ist allgemeiner: In der Funktion, in der das Array deklariert ist, wird es als tatsächliches Array behandelt. Nur wenn es als Argument an eine Funktion übergeben wird, wird es in einen Zeiger auf das erste Element umgewandelt. Dies ist der Grund, warum Funktionen, die Arrays verwenden, einen Zeiger auf das erste Element und ein Größenargument verwenden.

void print(const int *arr, size_t n) 
{ 
    size_t i; 

    for (i = 0; i < n; ++i) 
     printf("%d\n", arr[i]; 
} 
+0

Ich war nicht fertig bearbeitet. Deshalb war meine Post anfangs so schlecht. Bitte überdenken Sie Ihre Downvotes. – stackptr

0

Ich habe das Gefühl, Sie haben so etwas wie char Array_Name [20]; das würde '20' von der Funktion zurückgeben, in der Sie es deklariert haben, aber dann übergeben Sie es an eine andere Funktion, die akzeptiert: void f (char * Array_Name) {...} und hier ist der Wert 4 oder 8 (Größe von char *). Um dies leichter verständlich zu machen, benennen Sie zuerst das Argument in der Funktion in void f (char * My_Pointer) {...} um. Beachten Sie, dass 'sizeof' zur Kompilierzeit und nicht zur Laufzeit aufgelöst wird. Daher wissen wir zur Kompilierzeit nur, dass My_Pointer auf ein Zeichenarray zeigt, aber mit verschiedenen Arrays aufgerufen werden kann, so dass es sehr sinnvoll ist, die Größe von (char *) zu bestimmen.