Je ne suis pas sûr de ce qu'il y aura dans le tableau char après l'initialisation des manières suivantes.
1. char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";
Pour le cas 2, je pense que buf[0]
devrait être ' '
, buf[1]
devrait être '\0'
et de buf[2]
à buf[9]
sera un contenu aléatoire. Pour le cas 3, je pense que buf[0]
devrait être 'a'
, buf[1]
devrait être '\ 0', et de buf[2]
à buf[9]
sera un contenu aléatoire.
Est-ce exact?
Et pour le cas 1, que sera dans le buf
? buf[0] == '\0'
et de buf[1]
à buf[9]
sera un contenu aléatoire?
char buf[10]; buf = "a";
ne compile pas . - Veuillez d'abord essayer, puis copiez / collez votre code réel dans la question. Cela économise beaucoup de travail pour vous et pour tous les lecteurs de votre question.Réponses:
Ce n'est pas ainsi que vous initialisez un tableau, mais pour:
La première déclaration:
est équivalent à
La deuxième déclaration:
est équivalent à
La troisième déclaration:
est équivalent à
Comme vous pouvez le voir, pas de contenu aléatoire: s'il y a moins d'initialiseurs, le reste du tableau est initialisé avec
0
. C'est le cas même si le tableau est déclaré à l'intérieur d'une fonction.la source
char
.0
et'\0
ont la même valeur.char buff[3] = "abcdefghijkl";
n'est pas valide.char p3[5] = "String";
est également invalide.char p[6] = "String";
est valide et est identique àchar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.Edit: OP (ou un éditeur) a silencieusement changé certaines des guillemets simples de la question originale en guillemets doubles à un moment donné après avoir fourni cette réponse.
Votre code entraînera des erreurs de compilation. Votre premier fragment de code:
est doublement illégal. Premièrement, en C, il n'y a pas de vide
char
. Vous pouvez utiliser des guillemets doubles pour désigner une chaîne vide, comme avec:Cela vous donnera un pointeur vers une
NUL
chaîne, c'est-à-dire une chaîne à un seul caractère contenant uniquement leNUL
caractère. Mais vous ne pouvez pas utiliser de guillemets simples sans rien à l'intérieur - cela n'est pas défini. Si vous devez désigner leNUL
personnage, vous devez le spécifier:La barre oblique inverse est nécessaire pour lever l'ambiguïté du caractère
'0'
.accomplit la même chose, mais le premier est un peu moins ambigu à lire, je pense.
Deuxièmement, vous ne pouvez pas initialiser les tableaux une fois qu'ils ont été définis.
déclare et définit le tableau. L'identificateur de tableau
buf
est maintenant une adresse en mémoire et vous ne pouvez pas changer oùbuf
pointe par l'attribution. Alorsest illégal. Vos deuxième et troisième fragments de code sont illégaux pour cette raison.
Pour initialiser un tableau, vous devez le faire au moment de la définition:
vous donnera un tableau de 10 caractères, le premier caractère étant l'espace
'\040'
et le reste étantNUL
, c'est-à-dire'\0'
. Lorsqu'un tableau est déclaré et défini avec un initialiseur, les éléments du tableau (le cas échéant) après ceux avec les valeurs initiales spécifiées sont automatiquement complétés avec0
. Il n'y aura pas de "contenu aléatoire".Si vous déclarez et définissez le tableau mais ne l'initialisez pas, comme dans l'exemple suivant:
vous aurez un contenu aléatoire dans tous les éléments.
la source
Ce sont équivalents
Ce sont équivalents
Ce sont équivalents
la source
La partie pertinente de l'initialisation du projet de norme C11 n1570 6.7.9 dit:
et
Ainsi, le '\ 0' est ajouté, s'il y a suffisamment d'espace , et les caractères restants sont initialisés avec la valeur que a
static char c;
serait initialisée dans une fonction.Finalement,
Ainsi,
char
étant de type arithmétique, le reste du tableau est également garanti d'être initialisé avec des zéros.la source
Fait intéressant, il est possible d'initialiser des tableaux de n'importe quelle manière à tout moment dans le programme, à condition qu'ils soient membres d'un
struct
ouunion
.Exemple de programme:
la source
Je ne suis pas sûr, mais j'initialise généralement un tableau à "" dans ce cas, je n'ai pas besoin de m'inquiéter de l'extrémité nulle de la chaîne.
la source
main()
(et vous devez également utiliservoid
, c'est-à-direint main(void) { ... }
. C99 s'est débarrassé de cette règle, donc ce code ne sera pas compilé pour C99 et les versions ultérieures. L'autre chose à noter ici est que commençant par C99, si vous omettezreturn
dans main, il y a un automatiquereturn 0;
placé / implicite avant la}
fin de at main. Vous utilisez une règle int implicite qui ne fonctionne qu'avant C99, mais vous utilisez l'implicitereturn
qui ne fonctionne qu'avec C99 et les versions ultérieures ; ces deux sont évidemment contradictoires .