如何使用指针初始化结构?

hid*_*ame 2 c struct pointers

我是C的新手,我在练习时遇到了这个问题.
结构:

 typedef struct {
        char name[20];
        int score[3];
        int no;
    } Student;
Run Code Online (Sandbox Code Playgroud)

初始化:

Student *pStudent;
strcpy(pStudent->name,"Kven");
pStudent->score[0]=1;
pStudent->score[1]=2;
pStudent->score[2]=3;
pStudent->no=1;
Run Code Online (Sandbox Code Playgroud)

如果"pStudent"不是指针,我可以把它弄好.但如果它是一个指针,我总会得到一个"错误访问"错误.如果我必须使用指针,如何解决?谢谢.

axi*_*iac 6

类型指针的变量将地址存储在另一个变量的内存中(它指向另一个变量).

您的变量pStudent未初始化.它没有任何意义.实际上,它包含一些垃圾值,大多数情况下,它是不允许程序写入的内存区域的地址.这就是为什么当你试图在那里写(调用strcpy())时,操作系统会把你的程序打到它的"手"上,然后用你提到的错误信息终止它.

如何正确使用指针

指针的一种用法是指向静态分配的某个变量(在程序中定义):

Student s, *pStudent = &s;
Run Code Online (Sandbox Code Playgroud)

此示例声明了s类型Student的变量pStudent和指向它的变量.注意它被初始化,&s其地址是s.现在,您的代码用于pStudent初始化字段s.

指针的另一个用法是在运行时动态分配内存:

Student *pStudent;
pStudent = malloc(sizeof(Student));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,pStudent使用Student通过调用在运行时(它没有名称)创建的新类型变量的地址初始化malloc().malloc()分配一块内存(指定大小)并返回其地址.

当您不需要它时,您必须释放malloc()(使用free())分配的内存以供重用:

free(pStudent);
Run Code Online (Sandbox Code Playgroud)

在此调用之后,变量的值pStudent不会更改,它仍然指向相同的地址,但它无效并使用它会产生未定义的行为.在再次使用之前,您必须将另一个Student结构的地址pStudent(使用此处介绍的两种方法之一)放入其中.