gpt4 book ai didi

c - 用 C 编程 : Changing member value of struct gives segfault

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:58 24 4
gpt4 key购买 nike

关于这个主题有很多主题,但我一直无法找到适合我的解决方案;每当我尝试更改 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;
}

我可以很好地更改 degrees[i].course_id,但每当我尝试更改 degrees[i].member -> name 时,我都会遇到段错误。

GDB 表示这是 degrees[i].member->name = "Bob"行的结果,但我不明白为什么,我不知道如何有效地改变值学位[i].member->name

最佳答案

糟糕,你设法在那个小程序中放置了四个错误。

  1. main() 的签名应该是main(int argc, char *argv[])。 argv 是在命令行中找到的字符串数组
  2. 您为一个学位分配了内存,但在 for 循环中您初始化了三个。这会导致堆损坏。
  3. 您不初始化 degrees->member,而是使用它。
  4. 您为三个学生分配了内存,但没有使用它。

试试这个:

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

关于c - 用 C 编程 : Changing member value of struct gives segfault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43293088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com