Que renvoie sizeof (fonction (argument))?

Quel sera le résultat du programme

#include  int fun(char *a){ printf("%d\n",sizeof(a)); return 1; } int main(){ char a[20]; printf("%d\n",sizeof (fun(a))); return 0; } 

Sauf avec les tableaux de longueur variable, sizeof n’évalue pas son opérande. Donc, il ne fera que donner la taille du type fun(a) , ie sizeof(int) (sans appeler la fonction).

C11 (n1570) §6.5.3.4 _Alignof opérateurs et _Alignof

2 […] Si le type de l’opérande est un type de tableau de longueur variable, l’opérande est évalué; sinon, l’opérande n’est pas évalué et le résultat est une constante entière.

Il retourne la taille du type de retour depuis cette fonction ( 4 sur mon implémentation car c’est ce qu’un int prend pour moi), que vous découvririez si vous l’aviez exécuté tel quel, puis changé le type de retour en char vous donnerait 1 ).

La partie pertinente de la norme C99 est 6.5.3.4.The sizeof operator :

L’opérateur sizeof donne la taille (en octets) de son opérande, qui peut être une expression ou le nom entre parenthèses d’un type. La taille est déterminée à partir du type de l’opérande. Le résultat est un entier. Si le type de l’opérande est un type de tableau de longueur variable, l’opérande est évalué. sinon, l’opérande n’est pas évalué et le résultat est une constante entière.

Gardez à l’esprit ce bit gras, cela signifie que la fonction elle-même n’est pas appelée (d’où le printf qu’il printf n’est pas exécuté). En d’autres termes, la sortie est simplement la taille de votre type int (suivi d’une nouvelle ligne, bien sûr).

La fonction renvoie int , c’est donc sizeof(int) , qui sur un système 32 bits est généralement de 4 octets. Bien que cela puisse être 2 ou 8, en fonction de la mise en œuvre.

Le mot-clé sizeof suivi des points de suspension renvoie le nombre d’éléments dans un pack de parameters.

Le type du résultat est le type entier non signé size_t défini dans le fichier d’en-tête.