2010-09-30 4 views

Répondre

16

Il existe un '\0' de fuite à la fin.

+0

c'est ce que je pensais .... merci. –

5

Cela n'a rien à voir avec #define. Un tableau de caractères serait la même taille:

const char str[] = { "test1" }; 
sizeof (str) == 6 

La raison pour laquelle cette chaîne est de 6 octets est que les chaînes en C ont un caractère NUL de terminaison pour marquer la fin.

+2

Ce n'est pas un tableau, c'est un pointeur vers un littéral de chaîne, et 'sizeof (str)' retournera la taille du type de pointeur pour votre machine. –

+1

Ce que cela voulait dire, c'est que 'const char str [] =" test1 ";' est la même chose que 'const char str [] = {'t', 'e', ​​'s', 't', '1 ',' \ 0 '}; ' – aschepler

+1

Umm, ouais.Je me sens vraiment horrible, surtout depuis que j'ai pensé à la différence entre sizeof array et sizeof pointeur avant de taper la réponse, et puis mes doigts touchent les mauvaises touches de toute façon. –

2

Les chaînes dans C sont des matrices de char s, avec un terminateur nul, c'est-à-dire qu'elles se terminent par \0. L'alternative courante est celle des chaînes de style Pascal, où la chaîne stocke le tableau char sans le terminateur null et stocke la longueur de la chaîne à la place.

+1

Parler des chaînes de Pascal dans le contexte de C et C++ et des littéraux de chaîne, est terriblement trompeur. –

5

un #define juste fait un remplacement de texte avant la compilation.

#define STR "test1" 
sizeof(STR); 

est en fait vu par le compilateur comme

sizeof("test1"); 

maintenant pourquoi est-ce 6 et non 5? car il existe un terminateur null à la fin de la chaîne.

1

Ce que les autres ont dit ... MAIS

En C, jetons prétraiter prennent pas d'espace. Cela dépend de la façon dont vous les utilisez

#define STR "test1" 

char x[] = STR;   /* 6 bytes */ 
char *y = STR;   /* sizeof (char*) bytes (plus possibly 6 bytes) */ 
int ch = STR[3];  /* 1 byte (or sizeof (int), depending on how you look at it) */ 
if (ch == STR[1])  /* 1 byte (or sizeof (int) or no bytes or ...) */ 

printf("==>" STR "<==") /* 5 bytes ??? */ 
0

Le dernier compilateur C a une fonction de deviner si la personne qui écrit le programme est dans une phase d'apprentissage et donner des réponses qui les rendent la recherche plus large et plus profonde, et ainsi enrichir leurs connaissances .

Après la programmation pendant un certain temps, en fonction de votre apprentissage, vous pouvez voir la valeur descendre à 5. ;-)

JK .. comme quelqu'un l'a dit, symboliquement rien à la fin qui prend ironiquement octet.

1

Pourquoi cela prend-il 6 octets?

En fait, il faudra (6 octets × le nombre de fois que vous l'utilisez), parce qu'il est une macro préprocesseur. À la place, essayez const char *STR = "test1".

+1

Il n'est pas spécifié si des littéraux de chaînes identiques sont des objets distincts. C'est à dire. la valeur de l'expression '" test1 "==" test1 "' pourrait être vraie ou fausse. Cela peut même dépendre des paramètres du compilateur. – MSalters

Questions connexes