有没有一种方法可以将信息保存到结构的指针

时间:2019-05-13 17:28:40

标签: c pointers struct

我正在构建一个联系人管理应用程序,该应用程序需要有关该用户以及该用户的配偶的信息。我从一个结构开始,在那里我初始化了一个名字和一个指向配偶的指针。

我尝试将输入信息保存到指针,但是出现以下错误

GestionCarnet.c: In function ‘main’:
GestionCarnet.c:19:37: error: dereferencing pointer to incomplete type ‘struct Contact’
     scanf("%s", (contact_00->Spouse)->Name);

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    char Name[20];
    struct Contact *Spouse;
} Contact;

int main()
{
    Contact *contact_00;
    contact_00 = (Contact *)malloc(sizeof(Contact));

    printf("Add a contact: \n");
    printf("Name: \n");
    scanf("%s", (contact_00)->Name);
    printf("Spouse Name: \n");
    scanf("%s", (contact_00->Spouse)->Name);
    printf("================\n");
    free(contact_00);
    return 0;
}

是否可以将信息保存到结构的指针?如果为,该如何在我的代码中执行呢?谢谢。

2 个答案:

答案 0 :(得分:0)

可以通过在 typedef struct 之后键入结构名称来避免此错误。因此,结构定义变为:

typedef struct Contact
{
    char Name[20];
    struct Contact *Spouse;
} Contact;

如果要在结构内部使用struct Contact *Spouse;,则必须告诉编译器以后将对其进行定义,否则会出现错误。

配偶在这里是一个指针。这意味着无论何时要使用它,都需要为其分配内存。以下是在为配偶分配内存后也可以正常运行的完整程序:

#include <stdio.h>
#include <stdlib.h>

typedef struct Contact
{
    char Name[20];
    struct Contact *Spouse;
} Contact;

int main()
{
    Contact *contact_00;

    // Allocate both pointers
    contact_00 = (Contact *)malloc(sizeof(Contact));
    contact_00->Spouse = (Contact *)malloc(sizeof(Contact));

    printf("Add a contact: \n");
    printf("Name: \n");
    scanf("%s", (contact_00)->Name);
    printf("Spouse Name: \n");
    scanf("%s", (contact_00->Spouse)->Name);
    printf("================\n");

    // Testing:
    printf("Name: %s\n", (contact_00)->Name);
    printf("Spouse: %s\n", (contact_00->Spouse)->Name);

    // Free both pointers
    free(contact_00->Spouse);
    free(contact_00);
    return 0;
}

答案 1 :(得分:0)

该错误的原因是,您在使用尚未定义的新类型时,在给它命名后便定义了一个新类型。

  • 是否可以将信息保存到结构的指针?

是的,当您为结构分配内存时,您正在将内存分配给堆中所有字段,如果这些字段之一是指针,则您正在将内存分配给保存内存地址的变量。但是您仍然没有为该地址分配内存。 另外,不要忘记,在释放这种结构时,首先需要释放其字段可能指向的所有内存,然后释放结构本身。

  • 如果是,那我该如何在我的代码中做到这一点?

首先,我们需要修复结构,然后为该指针分配内存,请注意,我已将Contact定义为指向struct contact_t的指针:

typedef struct contact_t{
    char Name[20];
    struct contact_t *Spouse;
} *Contact;

使用结构:

Contact contact_00 = malloc(sizeof(*contact_00));
//check malloc result
contact_00->Spouse = malloc(sizeof(*contact_00->Spouse));
//check malloc result

//your code 

free(contact_00->Spouse);
free(contact_00);

请注意,将void*(malloc返回值)强制转换为其他指针是没有意义的。