我是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"不是指针我能说得对。但如果它是一个指针,我将永远得到一个"糟糕的访问"错误。如果我必须使用指针,如何解决?谢谢。
答案 0 :(得分:6)
类型指针的变量将地址存储在另一个变量的内存中(它指向另一个变量)。
您的变量pStudent
未初始化。它没有任何意义。实际上,它包含一些垃圾值,大多数情况下,它是不允许程序写入的内存区域的地址。这就是为什么当你试图在那里写(对strcpy()
的调用)时,操作系统会把你的程序打到它的“手”上并用你提到的错误信息终止它。
指针的一种用法是指向静态分配的某个变量(在程序中定义):
Student s, *pStudent = &s;
此示例声明类型为s
的变量Student
和指向它的变量pStudent
。请注意,它是使用&s
初始化的,s
是pStudent
的地址。现在,您的代码使用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);