Pourquoi un tableau de caractères a-t-il besoin de strcpy et non de star de caractères – en utilisant des structures en C

J’ai un malentendu concernant ce code –

typedef struct _EXP{ int x; char* name; char lastName[40]; }XMP ...main... XMP a; a.name = "eaaa"; a.lastName = strcpy(a.lastName, "bbb"); 

Pourquoi ne puis-je pas utiliser: a.lastName = "bbbb"; et c’est tout?

Bien considérer les types ici. Le tableau a le contenu de la chaîne, tandis que le caractère char* pointe simplement sur les données. En conséquence, le tableau nécessite strcpy et ses amis.

En outre, si vous allouiez de la mémoire pour le caractère char* sur le tas ou la stack et que vous vouliez ensuite affecter du contenu à celui-ci, vous devrez également utiliser strcpy car une simple affectation créerait un pointeur suspendu (une fuite de mémoire, par exemple).

Parce que l’emplacement d’un tableau est fixe, alors que la valeur d’un pointeur (qui est lui-même un emplacement) ne l’est pas. Vous pouvez affecter de nouvelles valeurs à un pointeur, mais pas à un tableau.

Sous le capot, ce sont la même chose. un nom de tableau en C est un pointeur, mais du sharepoint vue de la sémantique, vous ne pouvez pas réaffecter un tableau, mais vous pouvez en reconnecter un.

Quand tu écris

 a.name = "eaaa" ; 

le compilateur allouera de la mémoire pour une chaîne terminée par NULL eaaa\0 et, en raison de cette instruction, il fera pointer le name du pointeur vers cet emplacement (par exemple, la variable name contiendra l’adresse de l’emplacement de la mémoire où le premier octet de la chaîne réside).

Si vous avez plutôt le tableau, vous avez déjà une zone de mémoire allouée (qui ne peut pas être affectée à un autre emplacement de mémoire!) Et vous ne pouvez la remplir que de données (dans ce cas des octets représentant votre chaîne).

C’est ma compréhension de ce qui pourrait en être la raison.

Je pense que c’est à propos de la façon dont la langue fonctionne. C (et aussi C ++) produit un code non géré – ce qui signifie qu’ils n’ont pas besoin d’un environnement (comme la machine virtuelle Java) pour s’exécuter pour gérer la mémoire, les threads, etc. Ainsi, le code est produit dans un exécutable exécuté directement par le système d’exploitation. . Pour cette raison, l’exécutable inclut des informations, par exemple, sur la quantité d’espace à allouer pour chaque type (ce qui n’est pas certain pour les types dynamics), y compris les tableaux. (C’est aussi pourquoi C ++ a introduit les fichiers d’en-tête car c’était le seul moyen de connaître la taille d’un object lors de la compilation)

Ainsi, lorsque le compilateur voit un tableau de caractères, il calcule l’espace nécessaire pendant la phase de compilation et place ces informations dans l’exécutable. Lors de l’exécution du programme, le stream peut déterminer la quantité d’espace requirejse et allouer autant de mémoire. Si vous modifiez cela plusieurs fois, disons dans une fonction C, chaque affectation rendra la ou les précédentes invalides. Donc, IMO, c’est pourquoi le compilateur ne le permet pas.