7
votes

String littéral en C

Pourquoi le code suivant est-il illégal?

typedef struct{
   char a[6];
} point;

int main()
{
   point p;
   p.a = "onetwo";
}

c

2 commentaires

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.


6 Réponses :


12
votes

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


0 commentaires

7
votes

Vous ne pouvez jamais vous assigner à des tableaux après leur création; Ceci est tout aussi illégal:

strncpy(p.a, "onetwo", 6);


3 commentaires

Je suppose que je devrais être flatté que chaque réponse éditée dans ma solution Strcpy


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 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".



7
votes

Les tableaux sont 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>.

Cependant, vous pouvez initialiser un tableau lorsqu'il est défini. P>

Par exemple: P>

 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 


1 commentaires

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é").



1
votes

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'.


0 commentaires

3
votes

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. xxx

Donc, dans votre exemple d'origine, le code suivant doit compiler correctement: xxx


1 commentaires

+1 pour les exemples struct , mais notez que ces littéraux composés sont un ajout C99. (Idem va pour le commentaire de style '//'.)



1
votes

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;
}


0 commentaires