Есть ли способ сохранить информацию в указатель структуры - PullRequest
0 голосов
/ 13 мая 2019

Я создаю приложение для управления контактами, для которого требуется информация о пользователе и его супруге. Я начал со структуры, в которой инициализировал имя и указатель на супруга.

Я попытался сохранить введенную информацию в указателе, но я получаю следующую ошибку

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 голосов
/ 14 мая 2019

Причиной этой ошибки является то, что вы используете новый тип, который вы определяете, когда он еще не определен, после присвоения имени определяется новый тип.

  • Возможно ли этосохранить информацию в указателе структуры?

Да, когда вы выделяете память для структуры, вы выделяете память для всех ее полей в куче, если одно из этих полей является указателем,Вы выделяете память для переменной, которая содержит адрес памяти.Но вы все еще не выделили память для этого адреса.Кроме того, не забывайте, что когда вы освобождаете такую ​​структуру, вам необходимо сначала освободить всю память, на которую могут указывать ее поля, а затем освободить саму структуру.

  • Если, то какмне сделать это в моем коде?

Прежде всего нам нужно исправить структуру и затем выделить память для указателя, обратите внимание, что я определил 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) к другим указателям бессмысленно.

0 голосов
/ 13 мая 2019

Этой ошибки можно избежать, введя имя структуры после 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...