Domanda

Perché lo fa n non uguale a 8 nella seguente funzione?

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

Ma n fa uguale a 8 in questa versione della funzione:

void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}
È stato utile?

Soluzione

Poiché non è possibile passare interi array come parametri di funzione in C.In realtà stai passando un puntatore ad esso;le parentesi sono zucchero sintattico.Non ci sono garanzie che l'array a cui stai puntando abbia dimensione 8, poiché potresti passare a questa funzione qualsiasi puntatore di carattere desideri.

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

Altri suggerimenti

Gli array C e C++ non sono oggetti di prima classe;non puoi passare gli array alle funzioni, decadono sempre in puntatori.

È tuttavia possibile passare puntatori e riferimenti ad array.Ciò impedisce il decadimento dei limiti dell'array.Quindi questo è legale:

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

Nel primo esempio, cvalue come parametro passato è in realtà solo un puntatore a un array di caratteri e quando prendi il file sizeof() da esso, ottieni la dimensione del puntatore.Nel secondo caso, dove l'hai dichiarata come variabile locale, ottieni la dimensione dell'intero array.

La dimensione del parametro sui sistemi a 32 bit sarà 4 e sui sistemi a 64 bit compilati con -m64 sarà 8.Questo perché gli array vengono passati come puntatori nelle funzioni.Il puntatore è semplicemente un indirizzo di memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top