Spi*_*dis 3 c arrays string struct
当我运行程序并给id,name,surname赋值时,它会给出最后一个学生的所有值.例如,如果最后一个学生的名字是Anna,那么该数组的所有其他名称都是Anna.等级很好!我尝试了没有'构造函数'的功能,并且发生了相同的事情.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student{ /*struct for student info*/
char *id;
char *name;
char *surname;
int grade;
};
struct Student* Student_new(char* id, char* name, char* surname, int grade);
/*fuction: Student 'constructor'*/
int main(int argc, char *argv[]) {
int no; /*number of students*/
printf("Welcome! \n\nNumber of students: ");
scanf("%d", &no);
struct Student *studentArray[no]; /*arary of struct students*/
int i; /*counter*/
for(i=0; i<no; i++){
char id[10], name[10], surname[10];
int grade;
printf("\n\nStudent(%d)\n", i+1);
printf("id: ");
scanf("%s", id);
printf("name: ");
scanf("%s", name);
printf("surname: ");
scanf("%s", surname);
printf("grade: ");
scanf("%d", &grade);
studentArray[i] = Student_new(id, name, surname, grade); /*using Student
'constructor' to initialize the array*/
}
for(i=0; i<no; i++){
printf("%s %s %s %d \n", studentArray[i]->id, studentArray[i]-
>name, studentArray[i]->surname, studentArray[i]->grade);
}
return 0;
}
struct Student* Student_new(char* id, char* name, char* surname, int grade)
{
struct Student* st = malloc(sizeof(struct Student));
st->id = id;
st->name = name;
st->surname = surname;
st->grade = grade;
return st;
}
Run Code Online (Sandbox Code Playgroud)
请帮忙!!
问题是循环变量在每次迭代后超出范围,并且在Student实例中留下了悬空指针.您所看到的是未定义行为的结果.
可能发生的是将相同的char数组传递到每个学生实例中.然后修改相同的char数组,覆盖以前的值.
你需要复制字符串.请记住,创造像一个功能Student_free,您free将动态分配的副本.
struct Student* Student_new(char* id, char* name, char* surname, int grade)
{
struct Student* st = malloc(sizeof(struct Student));
st->id = strndup(id, 10);
st->name = strndup(name, 10);
st->surname = strndup(surname, 10);
st->grade = grade;
return st;
}
Run Code Online (Sandbox Code Playgroud)