理解c语言中的一行代码有困难

理解c语言中的一行代码有困难,c,pointers,casting,C,Pointers,Casting,我正在做一个练习,这是一段代码: typedef struct node { size_t size; struct node *next; } node_t; byte heap[SIZE]; node_t *node_list; void heap_init() { node_list = (node_t*) heap; node_list->size = SIZE; node_list->next = NULL; } 但我在排队

我正在做一个练习,这是一段代码:

typedef struct node 
{
    size_t size;
    struct node *next;
} node_t;

byte heap[SIZE];

node_t *node_list;

void heap_init()
{
    node_list = (node_t*) heap;
    node_list->size = SIZE;
    node_list->next = NULL;
}
但我在排队时遇到了一些麻烦:

node_list = (node_t*) heap;

heap
是大小为
size
的字节数组

node\u list
node\u t
类型的指针。此指针分配给数组
堆的第一个字节。这样做的目的是将
节点列表
分配给内存的分配位置

我猜列表的下一个指针将被分配到这个数组的另一个位置


这很可能是在全局变量中模拟堆,并避免使用某些嵌入式系统无法使用的
malloc

代码使用分配给
heap
的内存来存储
节点\u t
实例,而是使用
malloc
school函数之一分配它

变量
heap
本身降级为指向
byte*
的指针,代码表示“我想将
byte*
重新解释为
节点*
指针”


请注意,要使其工作,值
SIZE
必须至少为
sizeof(node\u t)
,否则,
节点\u t
实例将不适合
变量。

您指向的代码似乎使用了分配内存的不太常用的方法,即作为字节数组。。 而不是malloc或calloc的常用方法

现在

节点列表=(节点t*)堆

从这句话中我们可以推断出 因为堆在这里是字节数组,所以

节点列表是指向结构节点类型的指针,指向名为堆的字节数组起始地址,由于指针是字节*类型,因此类型转换为结构节点*类型

可以这样推断 结构节点*ptr=(结构节点*)malloc(sizeof(结构节点))

这里(struct node*)在malloc(sizeof(struct node))前面使用;typecastvoidmalloc返回的指针类型,以匹配所需的结构节点在“=”等号左侧键入


希望有帮助:)

Offtopic:peace->piece。这是未定义的行为,因为
可能没有正确对齐
节点。它还违反了严格的别名规则