Erreur dans le programme avec structures -segmentation error

#include  struct p { char *name; struct p *next; }; struct p *ptrary[10]; int main() { struct pp, q; p.name = "xyz"; p.next = NULL; ptrary[0] = &p; strcpy(q.name, p.name); ptrary[1] = &q; printf("%s\n", ptrary[1]->name); return 0; } 

Le programme donne l’erreur de segmentation à l’exécution. Qu’est-ce qui ne va pas ici? Dois-je allouer de la mémoire pour ptrary?

Vous devrez allouer de la mémoire avant de l’utiliser.

 q.name = malloc(10); strcpy(q.name, p.name); 

Edit: En tant que pointeur correctement déroulé, sizeof sera toujours 1. Donc, retirer de malloc .

Vous devez allouer de la place pour la chaîne avant d’utiliser strcpy() . Vous essayez de copier dans la mémoire une nouvelle chaîne contenant une chaîne initialisée à partir d’un littéral de chaîne, ce qui est totalement invalide. De telles chaînes doivent être considérées en lecture seule.

Vous pouvez éviter ce problème en copiant le pointeur, qui copiera ensuite la chaîne créée par le littéral de chaîne:

 q.name = p.name; 
 struct p { char *name; //name points nowhere struct p *next; }; 

strcpy(q.name, p.name); // q.name is any arbitrary value

Allouez la mémoire pour le name avant de l’utiliser.

OU déclarer comme:

 struct p { char name[4]; //the number of characters you require struct p *next; }; 
 #include  struct p { char name[10]; struct p *next; }; struct p *ptrary[10]; int main() { struct pp, q; strcpy(p.name , "xyz"); p.next = NULL; ptrary[0] = &p; strcpy(q.name, p.name); ptrary[1] = &q; printf("%s\n", ptrary[1]->name); return 0; } 

ou vous pouvez utiliser p.name = malloc(sizeof(char)*10);