将数据加载到struct和display,c

时间:2016-03-16 15:59:01

标签: c struct

我是新手使用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

我的代码中是否遗漏了某些内容?

3 个答案:

答案 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 ownerown;因此,它将指向有效的记忆。

另外,请勿忘记在free(own)返回之前添加main(),否则会导致内存泄漏。