comment définir char tableau à chaîne en c

donc j’ai un appel struct Process_Info

struct Process_Info { char name[128]; int pid; int parent_pid; int priority; int status; }; 

et un tableau d’informations sur les appels Process_Info. Je règle pid dans info sur un entier, cela fonctionne mais quand j’essaie de définir name dans info sur “{kernel}” comme ceci

 info[i].name="{kernel}"; 

et cela me donne un type incompatible en erreur d’atsortingbution. Je recherche en ligne, il me semble que je peux le faire, comme dans http://www.cs.bu.edu/teaching/cpp/ssortingng/array-vs-ptr/ , ils ont fait char label [] = “Single”; Alors qu’est-ce que je fais mal?

La réponse courte: le compilateur AC va cuire des chaînes constantes dans le binary, vous devez donc utiliser strncpy (ou strcpy si vous n’êtes pas inquiet pour la sécurité) pour copier “{kernel}” dans info[i].name .

La réponse la plus longue: chaque fois que vous écrivez

 char label[] = "Single"; 

le compilateur C va cuire la chaîne “Single” dans le binary qu’il produit et transformera label en pointeur sur cette chaîne. En langage C, “Single” est de type const char * et ne peut donc être modifié en aucune façon. Cependant, vous ne pouvez pas affecter un caractère const char * à un caractère char * , car un caractère char * peut être modifié.

En d’autres termes, vous ne pouvez pas écrire

 char label[] = "Single"; label[0] = "T"; 

parce que le compilateur ne permet pas la deuxième ligne. Cependant, vous pouvez modifier info[i].name en écrivant quelque chose comme

 info[i].name[0] = '['; 

parce que info[i].name si de type char * . Pour résoudre ce problème, vous devez utiliser strncpy (j’ai référencé une page de manuel ci-dessus) pour copier la chaîne “{Kernel}” dans info[i].name tant que

 strncpy(info[i].name, "{Kernel}", 256); info[i].name[255] = '\0'; 

ce qui vous évitera de déborder du tampon.

Je pense que vous pouvez vous tromper. La manière dont vous assigneriez ceci serait un caractère à la fois, comme si …

 name[] = {'a','b','c','d'};