2010-12-06 5 views
0

Consultez le code suivantSizeof ne retourne pas la taille réelle de la variable dans C

#include <stdio.h> 

void print(char string[]){ 
printf("%s:%d\n",string,sizeof(string)); 
} 

int main(){ 
char string[] = "Hello World"; 
print(string); 
} 

et la sortie est

Hello World:4 

Alors, quel est le problème?

+0

Qu'attendez-vous en sortie? – Epeli

+0

Je recommande d'utiliser 'std :: string'. C'est beaucoup plus facile de travailler avec. La longueur serait 'str.size()'. – jwueller

+2

std :: string est C++ plutôt que C –

Répondre

9

Il retourne la vraie taille de la "variable" (en fait, le paramètre de la fonction). Le problème est que ce n'est pas du genre que vous pensez qu'il est.

char string[], en tant que paramètre d'une fonction, est équivalent à char* string. Vous obtenez un résultat de 4 parce que c'est la taille, sur votre système, d'un char*.

S'il vous plaît lire la suite ici: http://c-faq.com/aryptr/index.html

1

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

+0

... dans le définition de "imprimer". Dans 'main',' string' est le nom d'un tableau. –

3

C'est la taille du pointeur char, pas la longueur de la chaîne.

Utilisez strlen de string.h pour obtenir la longueur de la chaîne.

+0

C'est OK si vous savez que la chaîne est terminée par NUL. Dans cette application, c'est. Mais généralement, une chaîne est juste un tableau de caractères –

+1

@Paul: En général, une "chaîne" est utilisée pour désigner un NTBS dans le contexte de C. Un tableau de caractères est juste un tableau de caractères. –

+1

OK, je peux me rétracter en général (mais il y avait une question SO hier qui était à propos d'une supposition erronée que les tableaux de caractères pourraient être terminés, donc je pense qu'il vaut la peine de le souligner) –

-2

http://www.java2s.com/Code/Cpp/Data-Type/StringSizeOf.htm voir ici, il a la même sortie que le vôtre ... et trouver ce que ur faire le mal

+1

C = + pas C, et il ne fait rien de "mal". –

+0

mon lien donné est à propos de C++ pas C ... alors quel est le problème MAN ... même si il a marqué sa question comme C –

+3

Exactement. Il a étiqueté sa question en C. Donc, savoir comment sizeof se comporte en C++ ne va pas être très utile –

0

Une chaîne en c est juste un tableau de caractères. Il n'est pas nécessairement terminé par NUL (bien que dans votre cas il l'est). Il n'y a aucun moyen pour la fonction de savoir combien de temps la chaîne lui est transmise - c'est juste donné l'adresse de la chaîne comme un pointeur. "String" est ce pointeur et sur votre machine (une machine 32 bits) il faut 4 octets pour stocker un pointeur. Donc sizeof (string) est 4

+0

Par définition, une chaîne dans C * doit * être terminée par 0 (7.1.1). Si une séquence de 'char' n'est pas terminée par 0, alors ce n'est pas une chaîne. –

+0

Cela ne fait que déplacer légèrement les poteaux latéraux. Char [] string est-il un paramètre définissant une chaîne, ou pas? En pratique, c'est à l'application. –

+0

Seulement si la séquence vers laquelle il pointe est 0-terminé. Toutes les chaînes sont des séquences de caractères, mais toutes les séquences de caractères ne sont pas des chaînes. Si 'string' a été initialisé comme' {'H', 'e', ​​'l', 'l', 'o', '', 'W', 'o', 'r', 'l', ' d '} ', alors la sortie de' print' serait indéterminée; il imprimera "Hello World" suivi d'une quantité d'ordure jusqu'à ce qu'il arrive à voir un caractère de valeur 0. –

1

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

1

Sauf quand il est un opérande des &sizeof ou unaire opérateurs, ou est chaîne littérale étant utilisée pour initialiser un autre tableau dans une déclaration, une expression de tableau aura son type implicitement converti ("decay") de "N-élément tableau de T" en "pointeur vers T" et sa valeur sera l'adresse du premier élément du tableau (n1256, 6.3.2.1/3).

L'objet string dans main est un réseau de 12 éléments de char. Dans l'appel à print dans main, le type de l'expression string est converti de char [12] à char *. Par conséquent, la fonction 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 ceci est seulement vrai pour les déclarations de paramètres de fonction (c'est l'un des plus grands défauts IMO de C).

Ainsi, la fonction print fonctionne avec un type de pointeur, pas un type de tableau, donc sizeof string renvoie la taille d'un char *, pas la taille de la matrice.

0

Vous avez demandé aux systèmes pour sizeof (l'adresse au début d'un tableau de caractères), chaîne est un objet, pour obtenir des informations sur sa longueur, vous devez le demander via l'interface OO correcte. Dans le cas de std :: string, la fonction membre string.length() renvoie le nombre de caractères stockés par l'objet chaîne.

Questions connexes