Frage

Warum n nicht gleich 8 in der folgenden Funktion?

void foo(char cvalue[8])
{
  int n = sizeof (cvalue);
}

Aber n tut gleich 8 in dieser version der Funktion:

void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}
War es hilfreich?

Lösung

Weil Sie nicht passieren können ganze arrays als Parameter der Funktion in C.Sie sind tatsächlich übergeben einen Zeiger auf es;die Klammern sind syntaktischer Zucker.Es gibt keine Garantien das array, das Sie zeigen sind, hat die Größe 8, da Sie nicht passieren konnten, diese Funktion jedes Zeichen, Zeiger, den Sie wollen.

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)

Andere Tipps

C-und C++ - arrays sind nicht die erste Klasse der Objekte;können Sie nicht das übergeben von arrays an Funktionen, die Sie immer decay Zeiger.

Sie können jedoch, übergeben von Zeigern und Referenzen auf arrays.Dies verhindert, dass der array-Grenzen, zerfällt.Also das ist legal:

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}

Im ersten Beispiel, cvalue, die als parameter übergeben wird, in der wirklich nur ein Zeiger auf ein Zeichen-array, und wenn Sie die sizeof() von ihm bekommen Sie die Größe des Zeigers.Im zweiten Fall, wo Sie deklarierten es als eine lokale variable, Sie bekommen die Größe des gesamten Arrays.

Die Größe der parameter, die auf 32-bit-Systeme 4 und 64-bit Systeme kompiliert mit -m64 8 sein wird.Dies ist, weil arrays übergeben werden, die als Zeiger in Funktionen.Der Zeiger ist nur eine Speicheradresse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top