указатели между динамическими структурами памяти - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь решить небольшую проблему из моего университета, но у меня возникают проблемы с ее завершением.

Задача состоит в том, чтобы написать код, определяющий все структуры данных, и создать связь между ними, используя указатели и mallocs.

НАЗНАЧЕНИЕ:

Есть 3 блока. 1) является статическим блоком с 2 полями, 1-е поле является целым числом, а второе поле указывает на другой блок.

2) блок с 2 полями. 1-е поле указывает на первый блок, а 2-е поле указывает на 3-й блок.

3) блок с 2 полями. 1-е поле является целым числом, а 2-е поле указывает на первый блок.

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

struct A;
struct B;
struct C;
typedef struct {
int element;
struct A * pointer3;
}C;

typedef struct {
    struct A * pointer 1;
    struct C * pointer 2;
}B;


typedef struct {
    int element;
    struct B * pointer 0;
 }A;

int main (){
    A a;
    a.pointer0 = (B*)malloc(sizeof(B));

Я достиг этого дальше, но проблема в последней строке. Выдает предупреждение об ошибке: присвоение из несовместимого типа указателя

1 Ответ

0 голосов
/ 01 июня 2019

Вопрос: Как выглядит struct A?Ответ: ваш компилятор понятия не имеет, потому что вы его никогда не определяли.

Вы предполагаете предварительное объявление типа структуры, а затем формальное объявление псевдонима typedef для структуры, в которой псевдоним name (но не тег) совпадает со структурой тег (без имени) будет разрешен.Не будетВы должны сделать это сами.

Начните с простого.Избавьтесь от псевдонимов типа полностью.И также избавьтесь от ненужных форвард-децлов (B и C). Как бы это выглядело?

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

struct A; // fwd decl

struct C 
{
    int element;
    struct A *pointer3; // uses fwd decl
};

struct B
{
    struct A *pointer1; // uses fwd decl 
    struct C *pointer2; // uses prior def
};

struct A // resolves fwd decl
{
    int element;
    struct B *pointer0; // uses prior def
};

int main() 
{
    struct A a;
    a.pointer0 = malloc(sizeof(struct B));
}

Это работает (в наиболее оптимистичном определении термина).Если вы хотите использовать псевдонимы typedef, вы можете добавить их прямо сейчас.Например, здесь есть все три структуры как с тегами, так и с псевдонимами.

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

struct A;
typedef struct A A;

typedef struct C 
{
    int element;
    A *pointer3;
} C;

typedef struct B
{
    A *pointer1;
    C *pointer2;
} B;

struct A 
{
    int element;
    B *pointer0;
};

int main() 
{
    A a;
    a.pointer0 = malloc(sizeof(B));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...