目标是将一个结构的数组包含在另一个结构中的另一个数组中。两个结构数组都应该分别声明和初始化。类似地提出的问题和答案只有我问题的一个组成部分,但没有这个或类似的组合。我在这里添加的代码只是一个简化的示例。所有数组大小和元素在执行之前都是已知的。
这是示例代码,无法编译"分段错误":
#include <stdio.h>
#include <string.h>
struct student_course_detail
{
int course_id;
char course_name[50];
};
struct student_detail
{
int id;
char name[20];
// structure within structure
struct student_course_detail *course[2];
}stu_data[2], *stu_data_ptr[2];
struct student_course_detail course_data[2] = {
{71145, "Course 1"},
{33333, "Course 2"},
};
struct student_detail stu_data[2] = {
{1, "Anna", &course_data[1]},
{2, "Tom", &course_data[2]}
};
int main()
{
stu_data_ptr[2] = &stu_data[2];
printf(" Id is: %d n", stu_data_ptr[0]->id);
printf(" Name is: %s n", stu_data_ptr[0]->name);
printf(" Course Id is: %d n",
stu_data_ptr[0]->course[0]->course_id);
//printf(" Course Name is: %s n",
// stu_data_ptr[0]->course[0]->course_name);
//printf(" Course Id is: %d n",
// stu_data_ptr[0]->course[1]->course_id);
//printf(" Course Name is: %s n",
// stu_data_ptr[0]->course[1]->course_name);
return 0;
}
链接到代码示例:https://www.onlinegdb.com/Hk2NQ42OU
结构成员course
是指向struct student_course_detail
的两个指针的数组。
从您尝试初始化它的方式来看,它不应该是一个数组,而是一个指向struct student_course_detail
:的普通指针
struct student_course_detail *course; // Pointer to a single student_course_detail structure
您在其他地方也有类似的问题(stu_data_ptr
(。
另外,不要忘记数组索引是零基,因此&course_data[2]
超出了course_data
数组的范围。
定义一个包含n个元素的数组时,元素的索引范围从0到n-1。
因此,在这种情况下,所有数组的大小都是2,因此您所拥有的元素都由0和1索引。
例如,这是非法的:
stu_data_ptr[2] = &stu_data[2]; //illegal
你可以做:
stu_data_ptr[1] = &stu_data[1];
或
stu_data_ptr[0] = &stu_data[0];//use this, since you use stu_data_ptr[0] later