用struct重写字符数组

用struct重写字符数组,c,C,我第一次用C语言处理结构,我不愿意承认我不太理解它。我试图构建一个指向学生结构的指针数组,以创建一个完整的学生数据库。问题是,如果我创建多个学生,第一个学生的名字和课程会被第二个学生覆盖。而且,仅使用name的输出非常奇怪。如果我叫“Sarah”,我会得到“Sara?LG?fa?e”,但课程很好。我觉得我可能在内存分配上做错了什么?我们也在这方面有所了解,但我也不是100%理解 下面是我正在编写的代码部分: typedef struct student Student; struct stud

我第一次用C语言处理结构,我不愿意承认我不太理解它。我试图构建一个指向学生结构的指针数组,以创建一个完整的学生数据库。问题是,如果我创建多个学生,第一个学生的名字和课程会被第二个学生覆盖。而且,仅使用name的输出非常奇怪。如果我叫“Sarah”,我会得到“Sara?LG?fa?e”,但课程很好。我觉得我可能在内存分配上做错了什么?我们也在这方面有所了解,但我也不是100%理解

下面是我正在编写的代码部分:

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);
    }


}
typedef结构学生;
结构学生
{
字符*名称;
智力年龄;
char*course1;
char*course2;
};
学生*数据[30];
整数计数=0;
作废新的()
{
智力年龄;
字符名[300];
炭层1[300];
炭层2[300];
字符合在一起[300];
char备注[300];
printf(“名称:”);
scanf(“%s”,名称);
printf(“年龄:”);
scanf(“%d”和年龄);
printf(“课程1:”);
scanf(“%s”,课程1);
printf(“课程2:”);
scanf(“%s”,课程2);
数据[计数]=malloc(sizeof(学生));
数据[计数]->name=名称;
数据[计数]->年龄=年龄;
数据[计数]->course1=course1;
数据[计数]->course2=course2;
计数++;
}
无效显示()
{
int i;
for(i=0;iname);
printf(“年龄:\t%d\n”,数据[i]->年龄);
printf(“course1:\t%s\n”,数据[i]->course1);
printf(“course2:\t%s\n”,数据[i]->course2);
}
}

谢谢大家的帮助:)

您只是将引用(指针)复制到数据,这意味着您的旧数据将丢失。你需要复印

Data[count]->name = (char*)malloc(...);
strcpy(Data[count]->name,name);

依此类推

哦,你没有为每个
学生
分配内存。如果已知字段的大小,则可以将存储声明为结构的一部分:

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));
如果要使用动态内存分配,则结构应与现在一样,但分配会发生变化:

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]);

那就是。。。不是处理结构中指针的正常方式。您正在结构中设置指向本地静态分配数组的指针。您要做的是为数组的每个结构成员提供
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);
当然,你还是得自己把它释放出来