c中的结构数组:给所有字符串赋予相同的值(使用int它运行良好).我该怎么办?

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)

请帮忙!!

cub*_*brr 5

问题是循环变量在每次迭代后超出范围,并且在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)