2013-05-12 2 views
1

Étant donné un pointeur et un tableau, la définition d'un égal à un autre échoue dans un cas et fonctionne dans un autre.Quand pouvez-vous utiliser le nom d'un tableau de caractères pour créer une valeur L valide?

char *c_ptr = "I'm a char pointer"; 
char c_arry[] = "I'm a char array"; 
c_ptr = c_arry; //This line works. 
c_arry = c_ptr; //This line fails. 

Lorsque la ligne ci-dessus échoue, il génère cet avertissement: "erreur: types incompatibles lors de l'affectation de type". Cette erreur semble malhonnête, et franchement, un peu salope, étant donné que juste une ligne avant, elle a affirmé qu'elle était mon type.

Essayer de comprendre cette question, je Relisez K & le chapitre de R sur les pointeurs et les tableaux et remarquées à la page 102 de leur affirmation selon laquelle « le nom du tableau est l'adresse de l'élément zeroth ». Si K & R est exacte, la substitution en & c_arry [0] devrait générer la même erreur, non? Mais cette ligne:

&c_arry[0] = c_ptr; 

me donne une nouvelle erreur: « lvalue nécessaire comme opérande gauche d'affectation ». Pourquoi cette valeur dite identique génère-t-elle une erreur différente? Lorsque GCC et K & R se contredisent, c'est alors que je me tourne vers les experts sur stackoverflow. En lisant un peu les valeurs l, j'en suis arrivé à la conclusion qu'il s'agit d'une question de valeur L et de valeur R, et que c_arry ne peut être qu'une valeur L - c'est-à-dire qu'une valeur assignée valeur - en deux, et seulement deux situations:

  • initialisation de chaîne (c.-à-char c_arry[] = "I'm a char array";)
  • et l'affectation de caractères (c.-à-c_arry[0] = 'A';)

est ma conclusion précise? S'agit-il des seulement de deux façons que c_arry peut jamais être attribué?

Ou, en d'autres termes, y a-t-il jamais un X, pour l'une des lignes de code suivantes, qui soit toujours valide?

c_arry  = X; 
&c_arry = X; 
&c_arry[0] = X; 
*c_arry = X; 
*c_arry[0] = X; 
+0

duplication possible de [Affectation d'un tableau char en C] (http://stackoverflow.com/questions/12160233/assigning-char-array-a-value-in-c) –

Répondre

1

Le fait que « le nom du tableau est l'adresse de l'élément zeroth » est vrai la plupart du temps ne signifie pas que vous pouvez l'affecter quoi que ce soit. Bien que ce

char str[] = "hello"; 

ressemble à une affectation, il s'agit en fait d'une initialisation; le concept de lvalue ne s'applique pas.

De plus, l'obtention d'une adresse en utilisant l'opérateur & ne produit jamais de lvalue, donc il n'y a aucun moyen de trouver un X qui ne casse pas les trois premiers exemples.

Les deux dernières, cependant, peut être attribué, avec quelques modifications mineures:

*c_arry = 'x';   // the same as c_arry[0] = 'x' 
char *c_arry_of_ptr[2]; 
... 
*c_arry_of_ptr[0] = 'x'; 


Une exception notable est sizeof(c_arry) - ici, ce n'est pas la même chose que sizeof(&c_arry[0]) pour les tableaux de taille autres que 1.

+2

Le fait que "le nom du tableau est l'adresse de l'élément zeroth "n'est pas réellement un fait. C'est plutôt un mensonge. (De plus, il vaut probablement la peine de mentionner que les tableaux * sont des * lvalues, c'est juste qu'ils sont spéciaux.) –

+0

Très utile et répondu si vite! Je vous remercie. Je vous voterais si je le pouvais. – schulwitz

+0

@schulwitz Je l'ai mis à jour en votre nom :) –

Questions connexes