stocker des chaînes de caractères dans les tableaux de char en C
#include<stdio.h>
int main()
{
char a[5]="hello";
puts(a); //prints hello
}
Pourquoi le code compile correctement? Nous avons besoin de six endroits pour stocker "hello"
, correct?
pourquoi le negvote?
probablement parce que le titre ne correspond pas à la question.
Fixe le titre après que j'ai été induit en erreur ici avec une recherche Google
probablement parce que le titre ne correspond pas à la question.
Fixe le titre après que j'ai été induit en erreur ici avec une recherche Google
OriginalL'auteur Lazer | 2010-03-24
Vous devez vous connecter pour publier un commentaire.
Le compilateur C permet d'exécuter à la fin des tableaux, il ne fait pas de vérifications de ce genre.
mais ces contrôles ne se produisent en C++, non?
Comme une déclaration générale, c'est incorrect, car le C Standard ne permettent compilateurs pour insérer des contrôles comme ils l'entendent (ce qui se passe est undefined comportement, mais cela ne signifie pas qu'un compilateur ne peut pas le définir); et, en effet, certains compilateurs ne insérer un tableau lié contrôles, en fonction des indicateurs de compilation, etc.
même chose que ci-dessus s'applique. Généralement, ils ne le font pas, mais votre compilateur C++ peut avoir une option pour les insérer, avec la mise en œuvre définies par l'effet si elles ne parviennent pas.
Je me souviens d'une présentation, je suis allé sur la conception d'un accident-résistant compilateur C/C++ quand pas s'écraser était un must. Il a fait des choses amusantes, comme la gestion des fuites de mémoire en les écrasant à la mémoire existante dans le code et en utilisant le modulo opérations sur les index de tableau au lieu de vérification des limites. Lors de l'essai le compilateur de programmes existants avec les bugs de collision, ils ont trouvé le plus travaillé.
OriginalL'auteur greg
Le compilateur C permet de vous demander explicitement pas de terminateur null.
Toute valeur inférieure à 5 entraîne une erreur.
Comme pour pourquoi - il est possible que vos chaînes sont de taille fixe, ou sont utilisés comme des tampons de valeurs d'octets. Dans ces cas, vous n'avez pas besoin d'un terminateur null.
Meilleure pratique consiste à utiliser
char a[]
sorte que le compilateur peut le régler à la bonne valeur (y compris terminator) automatiquement.OriginalL'auteur rjh
a
ne contient pas une chaîne terminée par null (en sus des initialiseurs pour les matrices de taille fixe - comme le terminateur null dans"hello"
- sont rejetés), de sorte que le comportement lors de l'un pointeur vers ce tableau est transmis àputs
est pas défini.Cela ne veut pas répondre à la question, qui était pourquoi cette compile en premier lieu, non pas comment il se comporte.
Maor: "extra initialiseurs pour les matrices de taille fixe sont jetés"
Il compile parce que c'est parfaitement légal de code C++. Le code C++ n'a pas à travailler 😉
Je pense que j'ai expliqué l'erreur; l'erreur est le passage d'un paramètre que n'est pas une chaîne nul à
puts
. L'initialisation de lachar
tableau est valide, même si douteuse.OriginalL'auteur CB Bailey
Dans mon expérience, beaucoup de compilateurs laissez-vous vous en sortir avec de la compilation. Il sera généralement crash au moment de l'exécution, bien que (parce que vous n'avez pas de terminateur null).
OriginalL'auteur Paul Michaels
C char initialisation de tableau comprend la valeur null seulement si il ya de la place ou si le tableau de dimensions ne sont pas précisées.
OriginalL'auteur Fred
Vous avez besoin de 6 caractères au magasin "bonjour" comme une chaîne terminée par null. Mais des tableaux de char ne sont pas contraints de stocker nul chaîne terminée, vous peut-être besoin du tableau pour un tout autre but, et en forçant un supplément de caractère nul dans ces cas, il serait inutile.
OriginalL'auteur AProgrammer
C'est parce qu'à C de gestion de la mémoire se fait à la main contrairement à java et quelques autres quelques langues....
Les six lieux que vous avez alloué n'est pas vérifiée lors de la compilation, mais si vous
entrer dans le dépôt(je veux dire le stockage de fait) vous allez avoir une erreur d'exécution parce que le programme conservé à cinq endroits en mémoire(mais il est prévu de tenir six) pour les personnages, mais le compilateur ne vérifie pas!
OriginalL'auteur
chaîne"hello" est conservé dans la mémoire en lecture seule avec un 0 à la fin. "une" des points de cette chaîne, c'est pourquoi le programme peut fonctionner correctement. Mais je pense que, généralement, c'est un comportement indéfini.
Il est nécessaire de voir le code assembleur généré par le compilateur pour voir ce qui se passe exactement. Si vous souhaitez obtenir indésirable de sortie dans cette situation, essayez:
hello
comme sortie!Il est nécessaire de tester les deux en Debug et Release configurations. Encore une fois, la vraie réponse est dans le code assembleur.
OriginalL'auteur Alex F
Le compilateur C que vous utilisez ne prend pas de vérifier que la chaîne de caractères littérale correspond à la char tableau. Vous avez besoin de 6 caractères dans le tableau pour s'adapter à la traduction littérale "Bonjour" depuis le littéral comprend une terminaison de zéro. Les compilateurs modernes, tels que Visual C++ 2010 faire vérifier ces choses et vous donner et d'erreur.
OriginalL'auteur Kyberias