112 votes

Pourquoi la taille d'un paramètre de tableau n'est-elle pas la même que dans main ?

Pourquoi la taille d'un tableau envoyé en paramètre n'est-elle pas la même que dans main ?

#include <stdio.h>

void PrintSize(int p_someArray[10]);

int main () {
    int myArray[10];
    printf("%d\n", sizeof(myArray)); /* As expected, 40 */
    PrintSize(myArray);/* Prints 4, not 40 */
}

void PrintSize(int p_someArray[10]){
    printf("%d\n", sizeof(p_someArray));
}

107voto

Prasoon Saurav Points 47488

Un type de tableau est implicitement converti en type de pointeur lorsque vous le passez à une fonction.

Donc,

void PrintSize(int p_someArray[10]) {
    printf("%zu\n", sizeof(p_someArray));
}

y

void PrintSize(int *p_someArray) {
    printf("%zu\n", sizeof(p_someArray));
}

sont équivalentes. Donc ce que vous obtenez est la valeur de *`sizeof(int)`**

0 votes

Ok mais y a-t-il un moyen d'imprimer la taille dans la fonction ?

2 votes

En C++, vous pouvez passer le tableau par référence à la fonction, mais vous ne pouvez pas le faire en C.

0 votes

D'accord, merci beaucoup ! Et à propos de cette histoire de référence, je me souviens qu'il ne faut pas utiliser ce mot en C car il a une signification spéciale en C++, je suppose que c'est le truc que tu mentionnes ?

20voto

user240312 Points 126

C'est un pointeur, c'est pourquoi il est courant de passer la taille du tableau comme second paramètre à la fonction

16voto

Pete Kirkham Points 32484

Comme d'autres l'ont dit, les tableaux se décomposent en pointeurs sur leur premier élément lorsqu'ils sont utilisés comme paramètres de fonction. Il convient également de noter que sizeof n'évalue pas l'expression et ne nécessite pas de parenthèses lorsqu'il est utilisé avec une expression. Votre paramètre n'est donc pas utilisé du tout, et vous pouvez tout aussi bien écrire sizeof avec le type plutôt qu'avec la valeur.

#include <stdio.h>

void PrintSize1 ( int someArray[][10] );
void PrintSize2 ( int someArray[10] );

int main ()
{
    int myArray[10];
    printf ( "%d\n", sizeof myArray ); /* as expected 40 */
    printf ( "%d\n", sizeof ( int[10] ) ); /* requires parens */
    PrintSize1 ( 0 ); /* prints 40, does not evaluate 0[0] */
    PrintSize2 ( 0 ); /* prints 40, someArray unused */
}

void PrintSize1 ( int someArray[][10] )
{
    printf ( "%d\n", sizeof someArray[0] );
}

void PrintSize2 ( int someArray[10] )
{
    printf ( "%d\n", sizeof ( int[10] ) );
}

12voto

S.C. Madsen Points 2342

Vous devrez donc passer la longueur du tableau comme deuxième paramètre. Lorsque vous écrivez du code dans lequel vous déclarez un tableau de taille constante, et que vous passez ensuite ce tableau à une fonction, il est pénible de faire apparaître la constante array-length à plusieurs endroits dans votre code...

K&R à la rescousse :

#define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0])) 

Vous pouvez donc maintenant faire, par exemple, ce qui suit

int a[10];
...
myfunction(a, N_ELEMENTS(a));

0 votes

Que faire si la taille du tableau n'est pas disponible au moment du codage, mais seulement au moment de l'exécution ? Existe-t-il un autre moyen de calculer la taille du tableau sans coder en dur sa taille ?

0 votes

La méthode présentée ne fonctionne que lorsque la déclaration du tableau est "en vue". Pour tous les autres cas, vous devez passer manuellement la longueur du tableau.

5voto

AraK Points 38702

Parce que les tableaux se décomposent en pointeurs lorsqu'ils sont passés comme paramètres. C'est ainsi que fonctionne le C, bien que vous puissiez passer des "tableaux" en C++ par référence et surmonter ce problème. Notez que vous pouvez passer des tableaux de tailles différentes à cette fonction :

 // 10 is superfluous here! You can pass an array of different size!
void PrintSize(int p_someArray[10]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X