web-dev-qa-db-fra.com

Déclaration et initialisation du tableau de caractères en C

J'étais curieux de savoir pourquoi cela n'est pas permis en C:

char myarray[4];

myarray = "abc";

Et cela est permis:

char myarray[4] = "abc";

Je sais que dans le premier cas, je devrais utiliser strcpy :

char myarray[4];

strcpy(myarray, "abc");

Mais pourquoi la déclaration et l'initialisation ultérieure ne sont pas autorisées et la déclaration et l'initialisation simultanée sont autorisées? Cela concerne-t-il la cartographie mémoire des programmes C?

Merci!

20
Alexey Pimenov

En effet, votre premier extrait de code n'effectue pas initialisation, mais Affectation:

char myarray[4] = "abc";  // Initialization.

myarray = "abc";          // Assignment.

Et les tableaux ne sont pas directement assignables en C.

Le nom myarray correspond en fait à l'adresse de son premier élément (&myarray[0]), qui n'est pas une lvalue , et en tant que telle ne peut pas être la cible d'une affectation.

36
Frédéric Hamidi

Oui, c'est une sorte d'incohérence dans le langage.

Le "=" dans myarray = "abc"; est une affectation (ce qui ne fonctionnera pas car le tableau est essentiellement une sorte de pointeur constant), alors que dans char myarray[4] = "abc"; il s'agit d'une initialisation du tableau. Il n'y a aucun moyen pour une "initialisation tardive".

Vous devriez juste vous rappeler cette règle.

4
Vlad

Ceci est un autre exemple C où la même syntaxe a des significations différentes (à des endroits différents). Bien que l'on puisse peut-être soutenir que la syntaxe devrait être différente pour ces deux cas, c'est ce qu'elle est. L’idée est que ce n’est pas que cela ne soit pas "non autorisé" mais que la seconde chose signifie quelque chose de différent (cela signifie "affectation de pointeur").

1
davep
myarray = "abc";

... est l'attribution d'un pointeur sur "abc" au pointeur myarray.

Ce n'est pas remplir le tampon myarray avec "abc".

Si vous voulez remplir le tampon myarray manuellement, sans strcpy (), vous pouvez utiliser:

myarray[0] = 'a', myarray[1] = 'b', myarray[2] = 'c', myarray[3] = 0;

ou

char *ptr = myarray;
*ptr++ = 'a', *ptr++ = 'b', *ptr++ = 'c', *ptr = 0;

Votre question concerne la différence entre un pointeur et un tampon (un tableau) . J'espère que vous comprenez maintenant comment C aborde chaque type.

1
pierre

Je pense que ce sont deux cas vraiment différents. Dans le premier cas, la mémoire est allouée et initialisée au moment de la compilation. Dans la seconde - en exécution. 

0
Nofate