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

时间:2015-04-15 13:39:48

标签: c pointers struct

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

 typedef struct {
        char name[20];
        int score[3];
        int no;
    } Student;

初始化:

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

如果" pStudent"不是指针我能说得对。但如果它是一个指针,我将永远得到一个"糟糕的访问"错误。如果我必须使用指针,如何解决?谢谢。

5 个答案:

答案 0 :(得分:6)

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

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

如何正确使用指针

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

Student s, *pStudent = &s;

此示例声明类型为s的变量Student和指向它的变量pStudent。请注意,它是使用&s初始化的,spStudent的地址。现在,您的代码使用s初始化Student *pStudent; pStudent = malloc(sizeof(Student));

的字段

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

pStudent

在这种情况下,Student初始化为malloc()的新变量的地址,该变量在运行时期间创建(它没有名称)malloc()malloc()分配一块内存(指定大小)并返回其地址。

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

pStudent

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

答案 1 :(得分:3)

Student *pStudent;

应该是

Student *pStudent = malloc(sizeof(Student));

在使用它完成数据写入之前为指针分配内存

free(pStudent);

答案 2 :(得分:2)

Student *pStudent;

创建一个类型为Student*的指针。该指针未初始化并指向某个“随机”位置。使用malloc中的calloc(或stdlib.h)为其分配内存:

pStudent = malloc(sizeof(Student));

然后使用以下内容将其释放:

free(pStudent);

答案 3 :(得分:2)

您不分配任何内存,只需分配指针即可。你需要学习指针及其工作原理。

修复如下代码:

Student student;
strcpy(student.name,"Kven");
student.score[0]=1;
student.score[1]=2;
student.score[2]=3;
student.no=1;

或者,您可以动态分配内存。 但在这种情况下没有任何意义(但我打赌至少有3个人会发布答案,告诉你这样做......)。另外,在进行动态分配之前,你真的需要研究指针。

Student *pStudent = calloc(1, sizeof(Student);

if(pStudent == NULL)
{
  // error handling
}

strcpy(pStudent->name,"Kven");
pStudent->score[0]=1;
pStudent->score[1]=2;
pStudent->score[2]=3;
pStudent->no=1;

...

free(pStudent);

答案 4 :(得分:1)

您需要先为您的结构分配内存。

您可以使用以下内容分配内存:

Student *pStudent = malloc(sizeof(Student));

然后你必须在最后用

发布它
free(pStudent);