用C编程:改变struct的成员值给出了段错误

时间:2017-04-08 10:48:11

标签: c pointers struct segmentation-fault typedef

关于这个主题有很多主题,但我找不到对我有用的解决方案;每当我尝试更改student_t.member-> name时,我都会遇到分段错误。下面是我需要使用的typedef结构:

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;
}

我可以完全改变度数[i] .course_id,但每当我尝试改变度数[i] .member - &gt;名字,我得到了一个分段错误。

GDB表示这是行度[i] .member-&gt; name =“Bob”的结果,但我不明白为什么,我不知道如何有效地改变价值of degrees [i] .member-&gt; name

1 个答案:

答案 0 :(得分:2)

哎呀,你设法在这个小程序中放了四个错误。

  1. main()的签名应为main(int argc, char *argv[])。 argv是在命令行中找到的数组字符串。
  2. 您为一度分配内存,但在for循环中初始化其中三个。这会导致堆损坏。
  3. 您不会初始化degrees-&gt;成员,但会使用它。
  4. 您为三名学生分配记忆,但不要使用它。
  5. 试试这个:

    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;
    }