Comportement de Sizeof in C

J’ai appris que lorsque nous passons le nom du tableau à sizeof, le nom du tableau ne se décompose pas en pointeur vers l’adresse de base. Le code ci-dessous confirme ce fait en donnant la réponse 10.

#include  int main(){ int arr[10]; printf("Size of array is %d" , sizeof(arr)/sizeof(int)); return 0; } 

Cependant, lorsque j’exécute le code ci-dessous, la réponse est fournie 1. Que la dimension soit écrite en prototype ou non, la réponse est 1. Pourquoi est-ce le cas?

 #include  void dimension(int arr[]){ printf("Sizof array is %d" , sizeof(arr)/sizeof(int)); } int main(){ int arr[10]; dimension(arr); return 0; } 

Cette signature

 void dimension(int arr[]) 

est absolument équivalent à

 void dimension(int *arr) 

Voir aussi la question 6.4

Parce que vous passez un tableau de taille inconnue qui équivaut à un pointeur dans ce contexte. sizeof est calculé à la compilation , pas à l’exécution.

Quand un tableau est passé à une fonction, il est passé en tant que pointeur, pas en tant que tableau, donc sizeof(arr) retournera sizeof(int *)

Les tableaux en tant qu’arguments de fonction se décomposent toutefois en pointeur. Comme cela se produit avant que sizeof () ne soit appelé, vous ne pouvez pas l’en empêcher.

Pensez-y simplement: comment sizeof () peut-il connaître la taille d’un tableau si un tableau de taille peut être transmis et qu’aucune information supplémentaire n’est disponible? Vous obtenez sizeof (pointeur), et cela semble avoir la même taille qu’un int, dans votre configuration.

Dans

 void dimension(int arr[]){ printf("Sizof array is %d" , sizeof(arr)/sizeof(int)); } 

arr[] se désintègre en un pointeur, vous avez donc l’équivalent de

 printf("Sizof array is %d" , sizeof(int*)/sizeof(int)); 

et parce que sur votre plate-forme, sizeof(int*) == sizeof(int) , vous recevez 1 comme résultat.

Notez cependant que pour les tableaux de longueur variable, sizeof devient une opération d’exécution:

 int main () { int i = ...; int x[i]; printf("number of elements: %d", sizeof (x) / size(*x)); } 

car arr est un pointeur, qui est un entier.

Il retourne la taille du pointeur, qui est un entier.

Parce que vous passez un tableau de taille inconnue.