理解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。这是未定义的行为,因为堆
可能没有正确对齐节点。它还违反了严格的别名规则