c - 动态结构内存之间的指针
问题描述
我正在尝试解决我大学的一个小问题,但我在完成它时遇到了麻烦。
任务是编写定义所有数据结构的代码,并使用指针和 malloc 在它们之间创建链接。
任务 :
有3个街区。1) 是一个有 2 个字段的静态块,第一个字段是一个整数,第二个字段指向另一个块。
2)一个有2个字段的块。第一个字段指向第一个块,第二个字段指向第三个块。
3) 一个有 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));
我已经走得更远了,但我遇到的问题是在最后一行。给我错误警告:从不兼容的指针类型分配
解决方案
问:struct 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));
}
这有效(在该术语的最乐观定义中)。如果你想使用 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));
}