comment sizeof () fonctionne dans les arguments de type pass par référence

J’ai passé un tableau à fonctionner et j’ai essayé de trouver la longueur du tableau. mais le résultat n’était pas attendu. Quelqu’un peut-il expliquer s’il vous plaît?

int main() { int array[10]={0}; func(array); return 0; } void func(int arr[]) { printf("length of an array is %d ",(sizeof(arr)/sizeof(arr[0])); } 

ça donne la réponse 2. quand j’ai essayé la même opération dans la fonction principale ça marche bien (la réponse est 10). // utilisation de gcc complier sous linux

Il me semble que le résultat est dû à sizeof(arr) == 8 (taille d’un pointeur sur votre PC) et sizeof(arr[0]) == 4 car c’est un entier donc 8/4==2 .

Cette déclaration: void func(int arr[]) indique à la fonction d’attendre un pointeur sur int en tant qu’argument.

Il n’est pas clair pour moi s’il est possible de calculer la sizeof un tableau par référence. C fonctions C acceptant une référence de tableau en tant qu’arguments ont toujours tendance à recevoir leur longueur également en tant qu’argument.

La différence avec main() fonction main() est qu’à l’intérieur du array main array variable est de type int[10] . Ainsi, sizeof est capable d’obtenir sa longueur en octets. Dans func , arr est de type int* donc sizeof ne vous donne que la longueur en octets d’un pointeur.

Vous envoyez et recevez un pionter de tableau, pas le tableau.

lors de l’envoi d’arg ::

 func(array[10]); 

Tout en recevant arg:

 void func(int array[10]) 

Mais ce n’est pas bien d’envoyer le tableau total. Donc, envoyez et recevez des arguments comme ci-dessous.

 func(array, arry_size); //function call void func(int array[], int length) //defin 

Vous devez vous rappeler que les tableaux se décomposent en indicateurs. Cela signifie que dans la fonction func la variable arr n’est pas réellement un tableau mais un pointeur. Et faire sizeof sur un pointeur renvoie la taille du pointeur et non ce à quoi il pointe.

Vous obtenez le résultat 2 car vous vous trouvez sur un système 64 bits où les pointeurs sont en 64 bits (soit 8 octets). Lorsque vous divisez par la taille de int (qui est 4 octets), vous obtenez le résultat 2 .

 sizeof(arr) 

est la taille d’un pointeur, et non la taille du bloc arr par.

Lorsque vous transmettez un tableau à une fonction en tant que paramètre, le tableau se décompose en un pointeur situé au début du tableau. Contrairement aux tableaux, un pointeur ne contient aucune méta-information. Une bonne pratique consiste à passer la taille à la fonction en tant que paramètre supplémentaire.

 void func(int *arr, int size); 

Voici ce que dit la norme C (C99 6.3.2.1/3 – Autres opérandes – Lvalues, tableaux et indicateurs de fonction):

Sauf s’il s’agit de l’opérande de l’opérateur sizeof ou de l’opérateur unaire &, ou s’il s’agit d’un littéral utilisé pour initialiser un tableau, une expression de type ” tableau de type ” est convertie en une expression de type ” type ” qui pointe sur l’élément initial de l’object tableau et n’est pas une lvalue

Donc, une fois que vous le transmettez à la fonction – À l’intérieur de la fonction, ce n’est plus un tableau, c’est un pointeur.

L’opérateur sizeof () renvoie la taille du type de données. ici int taille est deux.