C中字符串结构变量中的错误赋值

Sum*_*mit 2 c arrays struct pointers c-strings

请帮我处理这个代码。为什么将相同的名称分配给所有不同的结构?我是 C 中指针和数组的菜鸟。

struct student
{
    char *name;
    int reg_no;
};
typedef struct student student;

int main()
{
    char choice = 'y';
    char name[30];
    int rg;
    student students[5];
    int n = 0;
    while(choice != 'n')
    {
        printf("enter student's name\n>>");
        gets(name);
        printf("enter student's reg_no\n>>");
        scanf("%d",&rg);
        getchar();
        students[n].name = name;
        students[n].reg_no = rg;
        printf("enter details of more students (y/n)\n>>");
        scanf("%c",&choice);
        getchar();
        n++;
    }
    for(int i=0;i<n;i++)
    {
        printf("Details of student%d :\n",(i+1));
        printf("Name : %s\n",students[i].name );
        printf("Reg no. : %d\n\n",students[i].reg_no );
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在控制台中运行:

在此处输入图片说明

编辑:添加学生结构

Vla*_*cow 7

在这份声明中

students[n].name = name;
Run Code Online (Sandbox Code Playgroud)

name数组students 中所有元素的数据成员获取局部变量的相同地址name

您需要name将结构的数据成员声明为字符数组,并使用 C 标准函数strcpystrncpy将局部变量的内容复制name到数据成员name

例如

#define N 30

struct student
{
    char name[N];
    int reg_no;
};

typedef struct student student;

int main( void )
{
    char choice = 'y';
    char name[N];
    //…
Run Code Online (Sandbox Code Playgroud)

请注意,该函数gets是不安全的函数,C 标准不支持。而是使用标准的 C 函数fgets

例如

#include <string.h>

//…

fgets( name, sizeof( name ), stdin );
name[strcspn( name, "\n" )] = '\0';

//…
strcpy( students[n].name, name );
Run Code Online (Sandbox Code Playgroud)