我正在构建一个联系人管理应用程序,该应用程序需要有关该用户以及该用户的配偶的信息。我从一个结构开始,在那里我初始化了一个名字和一个指向配偶的指针。
我尝试将输入信息保存到指针,但是出现以下错误
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;
}
是否可以将信息保存到结构的指针?如果为,该如何在我的代码中执行呢?谢谢。
答案 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返回值)强制转换为其他指针是没有意义的。