我有以下结构
#define MAX_NAME_LENGTH 20
#define MAX_STUDENTS 20
typedef struct {
uint8_t grade;
char name[MAX_NAME_LENGTH];
} student_t;
typedef struct {
size_t count;
student_t students[MAX_STUDENTS];
} roster_t;
我构建了一个函数来创建某个年级的学生子数组。但是,我很困惑为什么以下内容不起作用。
roster_t get_grade(roster_t * roster, int grade){
roster_t grade_roster;
init_roster(&grade_roster);
int i = 0;
for (size_t j=0; j < roster->count; j++) {
if ( roster->students[j].grade == grade){
grade_roster.students[i] = roster->students[j];
i++;
}
}
return grade_roster;
}
.
.
.
// Called later
roster_t actual = get_grade(&roster, desired_grade);
当我添加一些打印进行测试时,我可以看到它似乎将学生添加到新的grade_roster中,但是当我从函数返回时,我得到一个空数组。
此后,我更新了函数以使用添加学生的辅助函数,效果很好,当它从函数返回时,我最终得到了一个填充数组,但这让我想知道为什么第一个解决方案不起作用。
感谢您的任何解释。
您忘记设置
grade_roster.count
。
roster_t get_grade(roster_t * roster, int grade){
roster_t grade_roster;
init_roster(&grade_roster);
size_t i = 0; /* use size_t instead of int for consistency */
for (size_t j=0; j < roster->count; j++) {
if ( roster->students[j].grade == grade){
grade_roster.students[i] = roster->students[j];
i++;
}
}
grade_roaster.count = i; /* add this */
return grade_roster;
}