2017-04-08 1 views
1

Il y a pas mal de sujets sur ce sujet mais je n'ai pas été capable de trouver une solution qui a fonctionné pour moi; Je reçois une erreur de segmentation chaque fois que j'essaie de changer le nom de student_t.member->. Ci-dessous la structure typedef que je suis obligé d'utiliser:Programmation en C: Modification de la valeur de membre de struct donne segfault

typedef struct degree_t degree_t; 
typedef struct student_t student_t; 

struct degree_t { 
    student_t* member; 
    int course_id; 
} 

struct student_t { 
    char* name; 
    int age; 
} 


int main(int argc, char* argv[]) { 

    student_t *students = malloc(sizeof(student_t) * 3); 
    degree_t *degrees = malloc(sizeof(degree_t)); 

    for (int i=0; i<3; i++) { 
     degrees[i].course_id = 1; 
     degrees[i].member->name = "Bob"; 
    } 
    return 0; 
} 

je peux changer degrés [i] .course_id parfaitement bien, mais chaque fois que j'essaie de changer degrés [i] .member -> nom, je reçois un erreur de segmentation. GDB indique qu'il s'agit d'un résultat de la ligne degrés [i] .member-> name = "Bob", mais je ne comprends pas pourquoi, et je ne sais pas comment modifier efficacement la valeur de degrés [i] .member-> name

+0

Assurez-vous d'allouer de la mémoire pour * tous * pointeurs, y compris ceux à l'intérieur de vos 'struct's. Question bien écrite par la manière, plus un. – Bathsheba

+0

Merci! J'espérais que ce ne serait pas trop un cauchemar à lire. Mais je suis légèrement confus avec l'allocation - quels pointeurs ont manqué sur allocation de mémoire pour? –

Répondre

2

Oups, vous avez réussi à placer quatre erreurs dans ce petit programme.

  1. La signature de main() doit être main(int argc, char *argv[]). argv est un tableau des chaînes trouvées sur la ligne de commande.
  2. Vous allouez de la mémoire pour un degré, mais dans la boucle for, vous en initialisez trois. Cela conduit à une corruption de tas.
  3. Vous n'initialisez pas degree-> member, mais vous l'utilisez.
  4. Vous allouez de la mémoire à trois étudiants, mais vous ne l'utilisez pas.

Essayez ceci:

struct degree_t { 
    student_t* member; 
    int course_id; 
} 

struct student_t { 
    const char* name; 
    int age; 
} 


int main(int argc, char* argv[]) { 
    degree_t *degrees = malloc(3 * sizeof(degree_t)); 

    for (int i=0; i<3; i++) { 
     degrees[i].course_id = 1; 
     degrees[i].member = malloc(sizeof(student_t)); 
     degrees[i].member->name = "Bob"; 
     degrees[i].member->age = 23; 
    } 
    return 0; 
} 
+0

Merci beaucoup pour votre réponse! Cela fonctionne parfaitement maintenant - je suis nouveau à l'allocation de mémoire donc (comme vous pouvez le dire) je ne suis pas très bon dans ce domaine. Et merci de corriger l'argument argv aussi! J'ai édité le post original concernant ceci, car mon programme contient l'argv [] mais j'avais négligé ceci quand j'ai écrit mon article. –

+0

Le problème argv [] n'est pas pertinent car vous n'utilisez pas d'arguments de ligne de commande. Vous pouvez même écrire 'void main() {...}', ce qui est faux mais fonctionne toujours. – user5329483

+0

Il serait judicieux d'utiliser 'int main (void)' puisque les arguments sont ignorés. L'utilisation de 'void' pour le type de retour n'est autorisée que par Microsoft. Sur les systèmes de type UNIX, 'void main (void)' est inconditionnellement incorrect. –