Sizeof ne renvoie pas la taille réelle de la variable en C

Considérons le code suivant

#include  void print(char ssortingng[]){ printf("%s:%d\n",ssortingng,sizeof(ssortingng)); } int main(){ char ssortingng[] = "Hello World"; print(ssortingng); } 

et la sortie est

 Hello World:4 

Alors qu’est-ce qui ne va pas avec ça?

Il renvoie la taille réelle de la “variable” (en réalité, le paramètre de la fonction). Le problème est que ce n’est pas du type que vous croyez.

char ssortingng[] , en tant que paramètre d’une fonction, équivaut à char* ssortingng . Vous obtenez un résultat de 4 car il s’agit de la taille, sur votre système, d’un caractère char* .

Veuillez lire plus ici: http://c-faq.com/aryptr/index.html

C’est la taille du pointeur de caractère, pas la longueur de la chaîne.

Utilisez strlen à partir de ssortingng.h pour obtenir la longueur de la chaîne.

ssortingng est un pointeur et sa taille est de 4. Vous avez probablement besoin de strlen .

un tableau se transformera en un pointeur en tant que paramètre de fonction dans ANSI C.

Sauf s’il s’agit d’un opérande de la sizeof ou d’un opérateur & unary, ou d’un littéral de chaîne utilisé pour initialiser un autre tableau dans une déclaration, une expression de tableau aura son type converti implicitement (“decay”) du “tableau de N éléments T “à” pointeur sur T “et sa valeur sera l’adresse du premier élément du tableau ( n1256 , 6.3.2.1/3).

La ssortingng object dans main est un tableau de caractères char de 12 éléments. Dans l’appel à print dans main , le type de la ssortingng expression est converti de char [12] en char * . Par conséquent, la fonction d’ print reçoit une valeur de pointeur, pas un tableau. Dans le contexte d’une déclaration de paramètre de fonction, T a[] et T a[N] sont tous deux synonymes de T * ; notez que cela n’est vrai que pour les déclarations de parameters de fonction (c’est l’un des plus gros défauts du C, l’OMI).

Ainsi, la fonction d’ print utilise un type de pointeur et non un type de tableau. Par conséquent, sizeof ssortingng renvoie la taille d’un caractère char * , pas la taille du tableau.

Une chaîne en c est juste un tableau de caractères. Ce n’est pas nécessairement NUL terminé (bien que dans votre cas, il est). Il n’ya aucun moyen pour la fonction de savoir combien de temps la chaîne lui est transmise – elle se contente de donner l’adresse de la chaîne sous forme de pointeur.

“Chaîne” est ce pointeur et sur votre machine (une machine 32 bits), il faut 4 octets pour stocker un pointeur. Donc sizeof (chaîne) vaut 4

Vous avez demandé aux systèmes la taille (l’adresse au début d’un tableau de caractères), ssortingng est un object. Pour obtenir des informations sur sa longueur, vous devez le demander via l’interface OO appropriée.

Dans le cas de std :: ssortingng, la fonction membre ssortingng.length () retournera le nombre de caractères stockés par l’object ssortingng.

http://www.java2s.com/Code/Cpp/Data-Type/SsortingngSizeOf.htm voir ici il a la même sortie que le vôtre … et trouve ce que vous faites de mal