2012-04-08 3 views
1

ich die ‚sizeof‘ Array berechnet werden soll:C++ sizeof anderes Ergebnis für den gleichen Wert

char* arr[] = { "abc", "def" }; 

Wenn ich sizeof manuell aufrufen, unmittelbar nach der Initialisierung des Arrays, es funktioniert gut. Wenn ich jedoch das Array an eine Funktion übergebe, ergibt es nicht das gleiche Ergebnis.

int test(char* b[]) { 
    return (int)sizeof(b); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char* arr[] = { "abc", "def" }; 
    int p = test(arr); // gives 4 
    int k = sizeof(arr); // gives 8 
    ... 
} 

Also, was ist das Problem? Sorry für die Newbie Frage, aber ich vermisse es wirklich.

+0

mögliche Duplikate von [Sizeof Array als Parameter übergeben] (http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) –

Antwort

3

Wenn Sie sizeof auf arr in _tmain, sind Sie die Größe des Arrays unter sich, die 2 * sizeof(char*) = 2 * 4 = 8 auf Ihre Architektur ist, weil Ihre char* s 32 Bits = 4 Bytes besetzen.

Wenn Sie sizeof auf b in test verwenden, sind Sie die Größe eines Zeigers auf das erste Element des Arrays nehmen, die sizeof(char**) = 4 auf Ihrer Architektur. Der Grund dafür, dass Sie die Größe des Zeigers und nicht das Array verwenden, besteht darin, dass Sie Arrays nicht als solche an Funktionen übergeben können. Stattdessen übergeben Sie sie über einen Zeiger an ihr erstes Element. Die Information über die tatsächliche Größe des Arrays geht somit in dem Aufruf verloren. Anders ausgedrückt, die Signatur Ihrer Funktion test entspricht int test(char **b).

+3

Vielen Dank, Herr, für eine kurze Erklärung. Ich schätze auch alle anderen Antworten. – grjj3

2

Dies ist, weil beim Aufruf einer Funktion in C oder C++, arrays decay to pointers.

Im ersten Fall sieht der Compiler arr als ein Array; im zweiten Fall sieht er nur einen Zeiger auf einen Zeiger.

0

An der Stelle, an der der Test definiert ist, kann der Compiler nicht sehen, worauf b zeigt. So gibt sizeof die Größe eines Zeigers (tatsächlich die Größe eines Zeigers auf Zeiger).

Inside Haupt, kann es sehr gut sehen, dass die tatsächliche Größe zwei Zeiger ist.

Es ist wirklich nicht so etwas wie die Übergabe von Array in Funktion - nur Zeiger auf Array übergeben wird. Die [] Form ist nur syntaktischer Zucker.

+0

Mehr wie Verschmutzung als Zucker. –

0

Sie verlieren die Größeninformation beim Aufruf test, weil Sie Array zu einem Zeiger verfällt.

Sie müssen die Größe des Arrays als zusätzlichen Parameter übergeben oder im Parametertyp fixieren.

0

Willkommen bei C++.

Sie können ein Array überhaupt nicht an eine Funktion übergeben. In C++ zerfallen Arrays die meiste Zeit zu Zeigern. Sie versuchen, ein Array zu übergeben, aber übergeben tatsächlich einen Zeiger, und Ihr zweites sizeof wertet die Größe dieses Zeigers aus.

Sie sollten sich nicht darum kümmern. Arrays sind spezialisierte Low-Level-Datenstrukturen, die nur zum Implementieren von Abstraktionen auf höherer Ebene verwendet werden sollten. Verwenden Sie stattdessen std::vector.

Verwandte Themen