2008-09-08 8 views
15

Pourquoi n n'est pas égal à 8 dans la fonction suivante?Différents formats de résultats

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

Mais n-t égal à 8 dans cette version de la fonction:

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

Répondre

45

Parce que vous ne pouvez pas passer des tableaux entiers comme paramètres de fonction en C. Vous passer en fait un pointeur à cela; les crochets sont du sucre syntaxique. Il n'y a aucune garantie que le tableau que vous pointez a la taille 8, puisque vous pouvez passer cette fonction à n'importe quel pointeur de caractère que vous voulez.

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

plus comme du cyanure syntactique ... –

1

Dans le premier exemple, cvalue comme paramètre passé est vraiment juste dans un pointeur sur un tableau de caractères et quand vous prenez le sizeof() de celui-ci, vous obtenez la taille du pointeur. Dans le second cas, où vous l'avez déclaré en tant que variable locale, vous obtenez la taille du tableau entier.

0

La taille du paramètre sur les systèmes 32 bits sera 4 et sur les systèmes 64 bits compilés avec -m64 sera 8. Cela est dû au fait que les tableaux sont passés en tant que pointeurs dans les fonctions. Le pointeur est simplement une adresse mémoire.

14

Les tableaux C et C++ ne sont pas des objets de première classe; vous ne pouvez pas passer des tableaux à des fonctions, ils se décomposent toujours en pointeurs.

Vous pouvez cependant transmettre des pointeurs et des références à des tableaux. Cela empêche les limites de tableau de se désintégrer. Donc c'est légal:

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

Vous méritez plus d'upmods pour votre solution intelligente. –

+1

@NickRetallack d'accord – Ulterior

+0

Juste besoin de noter que l'exemple de modèle est C++, pas C. C ne supporte pas les types de référence. – Peter

Questions connexes