我是新手使用C编程并尝试填充结构并打印存储在我的struct中的实际数据。我被segfault
困住了。看我的示例代码:
的main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
struct full_data
{
char *first_name;
char *last_name;
int *id_code;
};
struct owner
{
int *owner_code;
struct full_data tdata;
};
void display_my_output(struct owner *mydata)
{
printf("My data should be: \nfirst_name: %s\nlast_name: %s\nid_code: %d\nowner_id: %d\n",mydata->tdata.first_name ,mydata->tdata.last_name,mydata->tdata.id_code,mydata->owner_code);
}
int main()
{
int i;
struct owner *own;
for(i=0 ; i<4 ; i++)
{
if(i==0)
{
own->tdata.first_name = "PAUL";
}
if(i==1)
{
own->tdata.last_name = "ROOT";
}
if(i==2)
{
own->tdata.id_code =30001;
}
if(i==3)
{
own->owner_code = 2*i;
}
}
display_my_output(own);
return 0;
}
我期待我的出局:
My data should be:
first_name: PAUL
last_name: ROOT
id_code: 30001
owner_id: 6
我的代码中是否遗漏了某些内容?
答案 0 :(得分:3)
是的,您错过了声明并使用指向struct owner
的指针的事实,这意味着您必须对其进行初始化。
所以你可以做到
struct owner *own = calloc(1, sizeof(struct owner));
..
free(own);
但如果您不需要在堆上分配它,那么您可以在堆栈上分配它:
struct owner own;
own.tdata.first_name = ...;
在堆栈上分配它不会阻止您获取地址并将其传递给display_my_output
函数。您只需要通过display_my_output(&own);
调用它。
答案 1 :(得分:2)
您需要使用struct owner *own;
初始化malloc()
,如下所示:
own = (struct owner*) malloc(sizeof(struct owner);
并且不要忘记最后释放记忆:
free(own);
此外,在两个结构中,您正在创建一个指向整数而不是整数的指针。我认为你不需要int *。
答案 2 :(得分:0)
struct owner *own;
声明指向struct owner
的指针。是的,现在编译器知道对象own
指向的是struct owner
,但它指向哪个struct owner
?编译器不知道,因为你没有告诉它。
实际上,未初始化的指针可能指向无效/不可用的内存地址,或者包含一个&#34;陷阱表示&#34;。其中任何一个的结果都是未定义的行为,在您的情况下会导致segfault
。
要解决此问题,请写
struct owner *own = malloc(sizeof(struct owner));
对malloc()
的调用会分配一块内存来保存struct owner
到own
;因此,它将指向有效的记忆。
另外,请勿忘记在free(own)
返回之前添加main()
,否则会导致内存泄漏。