关于
这个主题有很多主题,但我无法找到适合我的解决方案;每当我尝试更改student_t.member->名称时,我都会遇到分段错误。下面是我需要使用的 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 ->名称时,我都会遇到分段错误。
GDB 表示这是行 degrees[i].member->name = "Bob" 的结果,但我不明白为什么,我不知道如何有效地更改 degrees[i].member->name 的值
糟糕,你设法在那个小程序中放置了四个错误。
main()
的签名应该是main(int argc, char *argv[])
. argv 是在命令行上找到的字符串数组。- 您为一度分配内存,但在 for 循环中初始化其中三个。这会导致堆损坏。
- 您不初始化学位>成员,而是使用它。
- 您为三个学生分配了内存,但不使用它。
试试这个:
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;
}