-1

我是第一次在 C 语言中使用结构,我不想承认我认为我不太了解它。我正在尝试构建一个指向学生结构的指针数组,以创建一个完整的学生数据库。问题是,如果我创建了一个以上的学生,第一个学生的姓名和课程会被第二个学生覆盖。此外,仅 name 的输出真的很奇怪。如果我给“莎拉”这个名字,我会得到“莎拉?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);
    }


}

谢谢大家的帮助 :)

4

3 回答 3

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

如果你想使用动态内存分配,那么结构应该是现在的样子,但是分配会改变:

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]);
于 2013-03-14T18:48:38.040 回答
0

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

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

等等

于 2013-03-14T18:43:52.543 回答
0

那是......不是处理结构中的指针的正常方法。您正在将结构中的指针设置为本地静态分配的数组。您想要做的是malloc()为每个数组的结构成员提供内存,例如:

void new()
{

    printf("name: ");
    Data[count]->name = malloc(300);
    scanf("%299s", Data[count]->name);

但是,当您完成代码后,您现在必须为所有结构的元素以及结构本身释放内存。


现在,如果您想变得更高级一些,并且gcc仅使用%aor%m修饰符(取决于标准)进行编译,则可以跳过 malloc:

    printf("name: ");
    scanf("%m", Data[count]->name);

但是,当然,您仍然必须自己释放它。

于 2013-03-14T18:50:11.817 回答