10
votes

Pourquoi Tailleof ("") est équivalent à 1 et Tailleof (NULL) équivaut à 4 en C-LUNTER?

pourquoi tailleOf ("") est équivalent à 1 et Tailleof (null) est équivalent à 4 en C-Langue?

c

0 commentaires

5 Réponses :


6
votes

null in c est défini comme (vide *) 0. Puisque c'est un pointeur, il faut 4 octets pour la stocker. Et, "" est 1 octet parce que la chaîne "vide" a un caractère EOL ('\ 0').


3 commentaires

"[Sur certaines implémentations] Il faut 4 octets pour la stocker".


4 octets pour un pointeur est fonction de l'architecture. J'ai utilisé des systèmes où il était 2 ou 8. ou 1 mot de machine 12 bits. Probablement l'OP utilise X86, mais ne sentez pas que vous pouvez supposer que ...


NULL n'est pas défini par C à quoi que ce soit, mais la "constante de pointeur nulle définie par la mise en œuvre" (C99 § 7.17.3). Sur certains OS, compilateur, plate-forme, phase de la lune, il peut être 0 sans couler à vide *. Pas de garanties.



2
votes

Tailleof (NULL) n'est pas rien, mais un pointeur à l'adresse 0, et un pointeur sur un système 32 bits prend 4 octets.


1 commentaires

NULL est la constante entier 0 casted sur un VOID * dans C. Cependant, c'est autorisé à être représenté au niveau de la machine comme des valeurs autres que zéro. Si un compilateur souhaitait que le pointeur NULL de niveau du matériel pointe sur 0xDeadbeef Il serait parfaitement valide, mais qui serait toujours représenté dans le code comme constant entier 0 .



21
votes

Un littéral à chaîne est un tableau de caractères * / fort> de caractères * (avec stockage statique), qui contient tous les caractères du littéral avec un terminateur. La taille d'un tableau est la taille de l'élément multiplié par le nombre d'éléments de la matrice.

Le littéral "" est un tableau qui consiste en un char avec la valeur 0 . Le type est char [1] et Tailleof (char) est toujours un; Par conséquent, tailleOf (char [1]) est toujours un.

in c, null est défini par la mise en oeuvre et est souvent ((vide *) 0) . La taille d'un vide * , sur votre implémentation particulière est 4. Cela peut être un nombre différent en fonction de la plate-forme que vous utilisez. NULL peut également étendre à un entier de type de valeur 0, et vous auriez la taille de cela.

* Un littéral n'est pas un pointeur, les tableaux ne sont pas des pointeurs, les pointeurs ne jouent pas un rôle dans cette partie de la question.


1 commentaires

NULL est une constante de pointeur NULL définie par la mise en oeuvre, il n'est pas nécessaire d'être ((vide *) 0) . Voir ma réponse.



0
votes

"" -> CStrings sont terminés par la convention avec un X'00 "NULLL PARTOIRE SO LITHLETH" "consiste en un personnage X'00 'et a SIE de 1 octet.

NULL est par défaut un pointeur NULL qui sur des machines de 32 bits particuliers a une taille de quatre octets sur différentes plates-formes qu'elle pourrait le 1,2,3,4,6 ou 8. peut-être même 5 ou 7 mais je ne suis jamais venu accrocher un adressage de 40 bits ou 56 bits. Également dans certaines architectures plus anciennes, il peut y avoir des bits supplémentaires associés à un pointeur pour indiquer des données par rapport à l'instruction par rapport au stockage tampon de périphérique, etc.


1 commentaires

Je voudrais éventuellement cela si je pouvais le comprendre à travers la mer de TYPOS;). Une chose - il pourrait être bénéfique de se référer à "" comme "littéral de caractère terminé null", sinon dans C ++, les gens peuvent penser que vous parlez de cstring de MFC classer.



13
votes

La chaîne vide "" a type char [1] ou "tableau 1 de char ". C'est pas un pointeur, car la plupart des gens croient. Il peut Decay dans un pointeur, donc à tout moment un pointeur sur char est attendu, vous pouvez utiliser un tableau de char et le tableau se décomposera dans un pointeur à son premier élément.

Etant donné que Tailleof (Char) est 1 (par définition), nous avons donc Tailleof ("") est Tailleof (Char [1]) , qui est 1 * 1 = 1.

in c, null est une "constante de pointeur null définie par la mise en œuvre" (C99 §7.17.3). Une "constante de pointeur nulle" est définie comme une expression entière avec la valeur 0, ou une telle expression moulée à type Void * (C99 §6.3.2.3.3). Donc, la valeur réelle de Tailleof (NULL) est définie par la mise en oeuvre: vous pouvez obtenir Tailleof (int) ou pour obtenir Tailleof (vide *) . Sur des systèmes 64 bits, vous avez souvent tailleOf (int) == 4 et tailleOf (vide *) == 8 , ce qui signifie vous ne pouvez pas dépendre sur ce que tailleof (null) est .

Notez également que la plupart des implémentations de C définissent null comme ((vide *) 0) (bien que cela ne soit pas requis par la norme), tandis que la plupart des implémentations C ++ définissent simplement NULL en tant que nature 0 . Cela signifie que la valeur de Tailleof (NULL) peut et modifiera en fonction de l'IF Code est compilé comme C ++ (par exemple, code dans les fichiers d'en-tête partagés entre c et c ++ fichiers source). Donc, ne dépendent pas de Tailleof (NULL) .


1 commentaires

Je crois que "une expression entière" n'est pas nécessairement de type int - les deux 0l et 0ll serait également conforme aux définitions de null , vous pourrez donc obtenir tailleof (long) ou Tailleof (long Long) aussi (ou peut-être même la taille d'un type d'entier défini par la mise en œuvre encore plus large !).