C 动态结构与内存之间的指针

C 动态结构与内存之间的指针,c,C,我正试图解决大学里的一个小问题,但我在完成它时遇到了麻烦 任务是编写定义所有数据结构的代码,并使用指针和malloc在它们之间创建链接 任务: 有3个街区。 1) 是包含两个字段的静态块,第一个字段是整数,第二个字段指向另一个块 2) 有两个字段的块。第一个字段指向第一个块,第二个字段指向第三个块 3) 有两个字段的块。第一个字段是整数,第二个字段指向第一个块 我已经开始创建代码和链接,但我不断得到错误,我似乎找不到他们的逻辑 struct A; struct B; struct C; type

我正试图解决大学里的一个小问题,但我在完成它时遇到了麻烦

任务是编写定义所有数据结构的代码,并使用指针和malloc在它们之间创建链接

任务:

有3个街区。 1) 是包含两个字段的静态块,第一个字段是整数,第二个字段指向另一个块

2) 有两个字段的块。第一个字段指向第一个块,第二个字段指向第三个块

3) 有两个字段的块。第一个字段是整数,第二个字段指向第一个块

我已经开始创建代码和链接,但我不断得到错误,我似乎找不到他们的逻辑

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));
我已经走得更远了,但我遇到的问题是在最后一行。
给我错误警告:来自不兼容指针类型的赋值问题:
结构A
看起来像什么?答:您的编译器不知道,因为您从未定义过它

假设正向声明一个结构类型,然后正式声明一个typedef别名到一个别名(但不是标记)与结构标记(没有名称)相同的结构。不会的。你必须自己做

从简单开始。完全消除类型别名。并且去掉任何不必要的前锋线(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));
}
#包括
#包括
结构A;//十二月份
结构C
{
int元素;
结构A*pointer3;//使用fwd decl
};
结构B
{
结构A*pointer1;//使用fwd decl
struct C*pointer2;//使用先前的定义
};
结构A//解析fwd decl
{
int元素;
结构B*指针0;//使用先前的定义
};
int main()
{
结构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));
}
#包括
#包括
结构A;
类型定义结构A;
类型定义结构C
{
int元素;
A*指针3;
}C;
类型定义结构B
{
A*指针1;
C*指针2;
}B;
结构A
{
int元素;
B*指针0;
};
int main()
{
A A;
a、 指针0=malloc(sizeof(B));
}

问题:
结构A
看起来像什么?答:您的编译器不知道,因为您从未定义过它

假设正向声明一个结构类型,然后正式声明一个typedef别名到一个别名(但不是标记)与结构标记(没有名称)相同的结构。不会的。你必须自己做

从简单开始。完全消除类型别名。并且去掉任何不必要的前锋线(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));
}
#包括
#包括
结构A;//十二月份
结构C
{
int元素;
结构A*pointer3;//使用fwd decl
};
结构B
{
结构A*pointer1;//使用fwd decl
struct C*pointer2;//使用先前的定义
};
结构A//解析fwd decl
{
int元素;
结构B*指针0;//使用先前的定义
};
int main()
{
结构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));
}
#包括
#包括
结构A;
类型定义结构A;
类型定义结构C
{
int元素;
A*指针3;
}C;
类型定义结构B
{
A*指针1;
C*指针2;
}B;
结构A
{
int元素;
B*指针0;
};
int main()
{
A A;
a、 指针0=malloc(sizeof(B));
}

您希望如何使用
结构A*指针1是否有效?此代码中没有
struct A
正式定义。也没有结构B
,也没有结构C
。上面所有的都只有远期存款。然后,分别有
A
B
C
的未标记结构typedef。简而言之:这里没有任何东西表明
struct A
等同于
A
,等等。因此,将一个(不明智的)强制转换分配给
B*
到应该是
struct B*
的东西对编译器来说毫无意义,它会警告您。当我搜索您的错误消息时,我发现很多页面都很好地解释了这个问题是否有效?此代码中没有
struct A
正式定义。也没有结构B
,也没有结构C。上面所有的都只有远期存款。然后,分别有
A
B
C
的未标记结构typedef。简而言之:这里没有任何东西表明
struct A
等同于
A
,等等。因此,将一个(不明智的)强制转换分配给
B*
到应该是
struct B*
的东西对编译器来说毫无意义,它会警告您。当我搜索您的错误消息时,我发现很多页面都很好地解释了这个问题。非常感谢你的回答,我现在已经清楚多了!非常感谢你的回答,我现在明白多了!