C char initialisation de tableau
Je ne suis pas sûr de ce qui va être dans le char tableau après l'initialisation de la manière suivante.
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 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 contenu aléatoire.
Est-ce exact?
Et pour le cas 1, ce sera dans le buf
? buf[0] == '\0'
et de buf[1]
à buf[9]
sera contenu aléatoire?
- Aucun de ces tableaux sont initialisés.
- Eh bien, mon compilateur n'accepte pas votre (corrigé) code: "tableau de type 'char [10] " n'est pas assignable".
- maintenant, il va travailler...
char buf[10]; buf = "a";
ne compile pas. - S'il vous plaît essayez d'abord, et ensuite copier/coller votre code dans la question. Qui permet d'économiser beaucoup de travail pour vous et pour tous les lecteurs de votre question.- Désolé pour ça. Je pensais que je peux attribuer le buf[] dernier, mais il semble que non. Maintenant, le code s'exécute.
- Double Possible de un littéral de chaîne de comptage partiel de l'initialiseur et zéro-initialiser?
- Âgées de question n'a de réponses dessin de normes et parle aussi d'agrégation de l'initialiseur ainsi
- Je ne pense pas que la question couvre toutes les question ici. Aussi, c'est une question de recherche convivial et clair, ce qui donne plus de points de vue sur cette question. Merci!
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas une façon d'initialiser un tableau, mais le 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: si 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.char
.'\0
ont la même valeur.char buff[3] = "abcdefghijkl";
? Est-ce valable et identique à charbuff[3] = {'a', 'b', 'c'}
?char buff[3] = "abcdefghijkl";
ne compile pas? (Je ne suis pas un codeur C.) Alors pourquoichar p3[5] = "String";
compiler?char p3[5] = "String";
est pas valide.char p[6] = "String";
est valide et est le même quechar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.0
.Edit: OP (ou l'éditeur) en silence changé certains des guillemets simples dans la question d'origine guillemets doubles à un certain point, après j'ai fourni cette réponse.
Votre code entraînera des erreurs de compilation. Votre premier fragment de code:
est doublement illégal. Tout d'abord, en C, il n'y a pas une telle chose comme un vide
char
. Vous pouvez utiliser des guillemets pour désigner une chaîne vide, comme avec:Qui vous donnera un pointeur vers un
NUL
chaîne, c'est à dire, une seule chaîne de caractères avec seulement leNUL
caractère. Mais vous ne pouvez pas utiliser les guillemets simples avec rien à l'intérieur-qui 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 personnage
'0'
.accomplit la même chose, mais la première est un peu moins ambigu, à lire, je pense.
Deuxièmement, vous ne pouvez pas initialiser les tableaux après qu'ils ont été définis.
déclare et définit la matrice. Le tableau identifiant
buf
est maintenant une adresse en mémoire, et vous ne pouvez pas modifier oùbuf
points le biais d'une cession. Doncest illégal. Le deuxième et le troisième fragments de code sont illégales pour cette raison.
Pour initialiser un tableau, vous devez le faire au moment de la définition:
vous offrons 10-tableau de caractères avec le premier char d'être l'espace
'\040'
et le reste étantNUL
, c'est à dire,'\0'
. Lorsqu'un tableau est déclarée et définie avec un initialiseur, les éléments du tableau (le cas échéant) au-delà de ceux avec des valeurs initiales sont automatiquement rembourré avec0
. Il n'y aura pas de "contenu aléatoire".Si vous déclarer et définir le tableau, mais ne pas l'initialiser, comme dans l'exemple suivant:
vous aurez du contenu aléatoire dans tous les éléments.
Ce sont les équivalents des
Ce sont les équivalents des
Ce sont les équivalents des
La partie pertinente de C11 projet de norme n1570 6.7.9 initialisation dit:
et
Ainsi, le '\0' est ajouté, si il y a assez d'espace, et les caractères restants sont initialisés avec la valeur qu'une
static char c;
serait initialisé à l'intérieur d'une fonction.Enfin,
Ainsi,
char
être un type arithmétique le reste du tableau est aussi la garantie d'être initialisé avec des zéros.Fait intéressant à noter, il est possible d'initialiser les tableaux en quelque sorte à tout moment dans le programme, à condition qu'ils soient membres d'un
struct
ouunion
.Exemple de programme:
Je ne suis pas sûr mais j'ai souvent initialiser un tableau à ""
dans ce cas, je n'ai pas besoin de vous préoccuper de la valeur null à la fin de la chaîne.
main()
(et vous devez également utiliservoid
, c'est à dire,int main(void) { ... }
. C99 à se débarrasser de cette règle, de sorte que ce code ne compile pas pour le C99 et plus tard. L'autre chose à noter ici est que départ avec C99, si vous omettezreturn
en main, il ya une automatiquereturn 0;
placé/implicite avant la}
à la fin. Vous êtes faisant usage de l'implicite int règle qui ne travaille qu'avant C99, mais vous êtes faisant usage de l'implicitereturn
qui ne fonctionne que avec le C99 et tard; ces deux sont évidemment contradictoires.