我正在尝试学习嵌套结构。当我使用结构变量访问它时,它工作得很好。但当我尝试使用指针访问它时,它会显示分段错误。
#include <stdio.h>
#include <stdlib.h>
struct Vehicle {
int eng;
int weight;
};
struct Driver {
int id;
float rating;
struct Vehicle v;
};
void main() {
struct Driver *d1;
d1->id = 123456;
d1->rating = 4.9;
d1->v.eng = 456789;
printf("%dn", d1->id);
printf("%fn", d1->rating);
printf("%dn", d1->v.eng);
}
必须先初始化指向有效缓冲区地址的指针,然后才能取消引用该地址。
例如:
void main(){
struct Driver d; /* add this */
struct Driver *d1;
d1 = &d; /* add this */
此外,我建议您在托管环境中使用标准的int main(void)
,而不是void main()
,这在C89和C99或更高版本中定义的实现中是非法的,除非您有特殊原因使用非标准签名。
在访问指针指向的内容之前,需要初始化指针
struct Driver data;
struct Driver *d1 = &data;
d1->id=123456;
d1->rating=4.9;
d1->v.eng=456789;
printf("%dn",d1->id);
printf("%fn",d1->rating);
printf("%dn",d1->v.eng);
注意data
的添加,以及指向它的d1
的初始化。运行时,它会产生:
123456
4.900000
456789
初始化它的另一种方法是通过malloc
使用动态分配的内存,在这种情况下,您稍后将释放分配的内存。
您使用的指针d1
没有初始化。
您需要首先初始化它,例如使用malloc
:
struct Driver *d1 = malloc(sizeof(struct Driver));
if(NULL == d1)
{
perror("can't allocate memory");
exit(1);
}
// ... using d1
free(d1);
return 0;