Je reçois une erreur de segmentation lorsque j'utilise strncpy
et je n'arrive pas à résoudre le problème.Je ne comprends pas pourquoi je reçois une erreur de segmentation due à strncpy
Voici mon fichier rectangle.h
. Ceci est juste un fichier d'en-tête. Il s'agit de mon fichier rectangle.c
. Je vais juste en montrer une fonction:
/* create_rectangle alloue dynamiquement de la mémoire pour stocker un rectangle, lui donne * valeurs initiales, et renvoie un pointeur vers le rectangle nouvellement créé. */
struct rectangle *create_rectangle(struct point ul, struct point lr,
char *label) {
struct rectangle *r = malloc(sizeof(struct rectangle));
/* TASK 1: fill in the rest of this function */
r->upperleft = ul;
r->lowerright = lr;
r->label = malloc(strlen(label) * sizeof(char));
strncpy(r->label, label, strlen(label) + 1);
return r;
}
Dans le code ci-dessus, j'utilise malloc
d'allouer suffisamment d'espace pour le pointeur d'étiquette.
Lorsque j'exécute le programme tester.c
ci-dessous, j'obtiens une erreur de segmentation (due au strncpy
).
int main(void) {
char *str1 = "Big rectangle";
char *str2 = "Square";
struct point *p1 = create_point(10, 10);
struct point *p2 = create_point(100, 100);
struct rectangle *r1 = create_rectangle(*p1, *p2, str1);
print_rectangle(r1);
printf(" expecting: (10, 10) (100, 100) Big rectangle\n");
free(p2);
p2 = create_point(20, 20);
struct rectangle r2;
strncpy(r2.label, str2, NAMESIZE); //GETTING SEGMENTATION FAULT DUE TO THIS LINE
}
Je pense que je reçois une erreur de segmentation fault parce que je fais strncpy
directement sur r2.label
. Je suspecte que parce que je n'alloue aucun espace à char *label
dans la structure de rectangle est pourquoi j'obtiens une erreur de faute de segmentation. Mais quand j'écris
char *label = malloc(sizeof(NAMESIZE) * sizeof(char));
Je reçois une erreur:
error: expected ';' at end of declaration list` error.
Considérez soigneusement si 'strncpy' est vraiment l'outil idéal pour le travail. Ce n'est * pas * juste un "plus sûr" 'strcpy'. Voir [my rant sur le sujet] (http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html), ainsi que la question 13.2 de le [comp.lang.c FAQ] (http://www.c-faq.com/). (Je ne suggère pas que c'est la cause du problème que vous voyez.) –
'malloc (sizeof (NAMESIZE) * sizeof (char))' - quoi? 'NAMESIZE' est un int donc cela alloue probablement 4 octets. –