我第一次使用C语言中的结构,我不愿承认我认为我不太了解它。我正在尝试构建一个指向学生结构的指针数组,以创建一个完整的学生数据库。问题是如果我创建了一个以上的学生,第一批学生的名字和课程将被第二批学生所覆盖。此外,名称上的输出真的很奇怪。如果我给出名字“Sarah”,我会回到“Sara?LG ?? fa?e”但课程结果很好。我觉得我可能在内存分配上做错了什么?我们也只是倾向于这一点,我也不理解它。
以下是我正在处理的代码部分:
typedef struct student Student;
struct student
{
char *name;
int age;
char *course1;
char *course2;
};
Student *Data[30];
int count = 0;
void new()
{
int age;
char name [300];
char course1 [300];
char course2 [300];
char together[300];
char remarks[300];
printf("name: ");
scanf("%s", name);
printf("age: ");
scanf("%d", &age);
printf("course-1: ");
scanf("%s", course1);
printf("course-2: ");
scanf("%s", course2);
Data[count] = malloc(sizeof(Student));
Data[count]->name = name;
Data[count]->age = age;
Data[count]->course1 = course1;
Data[count]->course2 = course2;
count++;
}
void display()
{
int i;
for(i=0; i<count; i++)
{
printf("name:\t%s\n", Data[i]->name);
printf("age:\t%d\n", Data[i]->age);
printf("course1:\t%s\n", Data[i]->course1);
printf("course2:\t%s\n", Data[i]->course2);
}
}
感谢大家的帮助:)。
答案 0 :(得分:1)
哦,你没有为个人Student
分配内存。如果已知字段大小,则可以将存储声明为结构的一部分:
struct student
{
char name[300];
int age;
char course1[300];
char course2[300];
};
然后填写如下:
Data[count] = malloc(sizeof(Student));
strncpy(Data[count]->name, name, sizeof(Data[count]->name));
Data[count]->age = age;
strncpy(Data[count]->course1, course1, sizeof(Data[count]->course1));
strncpy(Data[count]->course2, course2, sizeof(Data[count]->course2));
如果你想使用动态内存分配,那么struct应该像现在一样,但是分配会改变:
Data[count] = malloc(sizeof(Student));
Data[count]->name = strdup(name);
Data[count]->age = age;
Data[count]->course1 = strdup(course1);
Data[count]->course2 = strdup(course2);
....
当你解除分配时,不要忘记字段:
free(Data[count]->name);
free(Data[count]->course1);
free(Data[count]->course2);
free(Data[count]);
答案 1 :(得分:0)
您只是将引用(指针)复制到数据,这意味着您的旧数据会丢失。你需要制作副本
Data[count]->name = (char*)malloc(...);
strcpy(Data[count]->name,name);
等等
答案 2 :(得分:0)
这是......不是处理结构中指针的常规方法。您将结构中的指针设置为本地静态分配的数组。对于每个数组的结构成员,您要做的是malloc()
内存,例如:
void new()
{
printf("name: ");
Data[count]->name = malloc(300);
scanf("%299s", Data[count]->name);
但是当你完成代码时,你现在必须为所有结构元素以及结构本身释放内存。
现在,如果你想获得一点点发烧友,和你只能用gcc
编译,你可以使用%a
或%m
修饰符(取决于标准)跳过mallocs:
printf("name: ");
scanf("%m", Data[count]->name);
但当然你必须自己解放它。