pourquoi tailleOf ("") code> est équivalent à 1 et Tailleof (null) code> est équivalent à 4 en C-Langue? P>
5 Réponses :
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'). P>
"[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.
Tailleof (NULL) n'est pas rien, mais un pointeur à l'adresse 0, et un pointeur sur un système 32 bits prend 4 octets. P>
NULL code> est la constante entier 0 casted sur un VOID * code> 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 code> Il serait parfaitement valide, mais qui serait toujours représenté dans le code comme constant entier 0 code>.
Un littéral à chaîne est un tableau Le littéral in c, * 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. P> "" code> est un tableau qui consiste en un char code> avec la valeur 0 code>. Le type est char [1] code> et Tailleof (char) code> est toujours un; Par conséquent, tailleOf (char [1]) code> est toujours un. p>
null code> est défini par la mise en oeuvre et est souvent ((vide *) 0) code>. La taille d'un vide * code>, sur votre implémentation particulière em> est 4. Cela peut être un nombre différent en fonction de la plate-forme que vous utilisez. NULL code> peut également étendre à un entier de type de valeur 0, et vous auriez la taille de cela. P>
NULL code> est une constante de pointeur NULL définie par la mise en oeuvre, il n'est pas nécessaire d'être ((vide *) 0) code>. Voir ma réponse.
"" -> 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. P>
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. P>
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 à "" code> comme "littéral de caractère terminé null", sinon dans C ++, les gens peuvent penser que vous parlez de cstring de MFC code> classer.
La chaîne vide Etant donné que in c, Notez également que la plupart des implémentations de C définissent "" code> a type char [1] code> ou "tableau 1 de char code>". C'est pas em> un pointeur, car la plupart des gens croient. Il peut Decay em> dans un pointeur, donc à tout moment un pointeur sur char code> est attendu, vous pouvez utiliser un tableau de char code> et le tableau se décomposera dans un pointeur à son premier élément. P>
Tailleof (Char) code> est 1 (par définition), nous avons donc Tailleof ("") code> est Tailleof (Char [1]) code>, qui est 1 * 1 = 1. p>
null code> 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 * code> (C99 §6.3.2.3.3). Donc, la valeur réelle de Tailleof (NULL) code> est définie par la mise en oeuvre: vous pouvez obtenir Tailleof (int) code> ou pour obtenir Tailleof (vide *) code>. Sur des systèmes 64 bits, vous avez souvent tailleOf (int) == 4 code> et tailleOf (vide *) == 8 code>, ce qui signifie vous ne pouvez pas dépendre sur ce que tailleof (null) code> est em>. p>
null code> comme ((vide *) 0) code> (bien que cela ne soit pas requis par la norme), tandis que la plupart des implémentations C ++ définissent simplement NULL code> en tant que nature 0 code>. Cela signifie que la valeur de Tailleof (NULL) code> peut et modifiera en fonction de l'IF Code est compilé comme C ++ strud> (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) CODE>. P>
Je crois que "une expression entière" n'est pas nécessairement de type int code> - les deux 0l code> et 0ll code> serait également conforme aux définitions de null code>, vous pourrez donc obtenir tailleof (long) code> ou Tailleof (long Long) code> aussi (ou peut-être même la taille d'un type d'entier défini par la mise en œuvre encore plus large !).