Pourquoi le code suivant est-il illégal?
typedef struct{
char a[6];
} point;
int main()
{
point p;
p.a = "onetwo";
}
6 Réponses :
Cela n'a rien à voir avec la taille. Vous ne pouvez pas attribuer de littéral à chaîne à un tableau de caractères après sa création - vous ne pouvez l'utiliser qu'au moment de la définition.
Lorsque vous faites P>
strcpy(p.a, "12345");//give space for the \0
Vous ne pouvez jamais vous assigner à des tableaux après leur création; Ceci est tout aussi illégal:
strncpy(p.a, "onetwo", 6);
Je suppose que je devrais être flatté que chaque réponse éditée dans ma solution code> Strcpy code>
Ici, avez un +1. J'avais +2 si je pouvais, mais je trouve cela un peu étrange que personne n'ait encore remarqué que ceci est un struct code> contenant un tableau, pas seulement un tableau simple.
Bien sûr, "Strncpy" vient avec ses propres problèmes, contrairement à la plupart des autres fonctions "n".
Les tableaux sont Cependant, vous pouvez initialiser un tableau lorsqu'il est défini. P> Par exemple: P> LValues non modifiables code>. Donc, vous ne pouvez pas leur assigner. Le côté gauche de l'opérateur d'affectation doit être un LValue code>. char a[] = "Hello World" ;// this is legal
char a[]={'H','e','l','l','o',' ','W','o','r','l','d','\0'};//this is also legal
//but
char a[20];
a = "Hello World" ;// is illegal
Il serait plus clair si vous utilisiez le terme correct 'initialisée' au lieu d'une "assignation" lorsqu'un tableau est "défini" (plutôt que "déclaré").
Notez que pour stocker la chaîne "Onetwo" dans votre tableau, il doit être de longueur [7] et non comme écrit dans la question. Le caractère supplémentaire consiste à stocker le terminateur '\ 0'. P>
Au fur et à mesure que d'autres réponses ont déjà signalé, vous ne pouvez initialiser qu'une matrice de caractères avec un littéral à chaîne, vous ne pouvez pas attribuer de littéral à chaîne à un réseau de caractères. Cependant, les structures (même celles contenant des tableaux de caractères) sont une autre bouilloire de poisson.
Je ne recommanderais pas de faire cela dans un programme réel, mais cela démontre que, bien que les types de tableaux ne puissent pas être attribués à, les structures contenant des types de matrices peuvent être. p> Donc, dans votre exemple d'origine, le code suivant doit compiler correctement: p>
+1 pour les exemples struct code>, mais notez que ces littéraux composés sont un ajout C99. (Idem va pour le commentaire de style '//'.)
aucun littéral Company StrcPY ou C99 est nécessaire. L'exemple de Pure ANSI C:
typedef struct{
char a[6];
} point;
int main()
{
point p;
*(point*)p.a = *(point*)"onetwo";
fwrite(p.a,6,1,stdout);fflush(stdout);
return 0;
}
Dupliqué possible de Affectation de chaînes aux tableaux de caractères
Pas tout à fait un duplicata, car il s'agit d'une structure contenant un réseau de caractères, qui est subtilement différente d'un tableau de caractères ordinaire, j'ai expliqué cela dans ma réponse.