绑定Malloc调用

绑定Malloc调用,c,memory-management,linked-list,malloc,nodes,C,Memory Management,Linked List,Malloc,Nodes,我浏览了一下,发现这给我提出了一个问题 struct node* BuildOneTwoThree() { struct node *list = malloc(3 * sizeof(struct node)); list[0].data = 1; list[0].next = list+1; list[1].data = 2; list[1].next = list+2; list[2].data = 3; list[2].next = NULL; return list;} 我试图理解

我浏览了一下,发现这给我提出了一个问题

struct node* BuildOneTwoThree() {
struct node *list = malloc(3 * sizeof(struct node));

list[0].data = 1;
list[0].next = list+1;
list[1].data = 2;
list[1].next = list+2;
list[2].data = 3;
list[2].next = NULL;

return list;}
我试图理解这个对malloc的调用是如何工作的,以及它返回了什么。它是否返回指针数组?这是怎么回事,我没想到malloc会这样工作

这似乎保证了单个结构的内存索引是一个接一个的,我认为这可能是一个强大或有用的工具

同样,在调用malloc之后,是否可以将数组索引初始化为

list[0] = (struct node) {1, list +1};
注:结构节点定义为:

  struct node{
  int data;
  struct node *next;};

malloc
返回指向指定大小的内存区域的指针

参数
3*sizeof(struct node)
表示区域大小能够存储3
node
结构


数组中的指针和索引是可互换的,如中所述。

malloc
返回指向指定大小内存区域的指针

参数
3*sizeof(struct node)
表示区域大小能够存储3
node
结构

数组中的指针和索引是可互换的,如中所述

==>创建了一个三节点结构大小的内存,列表指向内存存储的开头。它的意思是list=&list[0]或*list=list[0],list+1=&(list[1])或*(list+1)=list[1],list+2=&(list[2])或*(list+2)=list[2]

list[0] = (struct node) {1, list +1};
==>是的,你可以这样做。这是我的修改,因为这样做效果很好:

struct node* BuildOneTwoThree() {
    struct node *list = (struct node *)malloc(3 * sizeof(struct node));

    list[0] = { 1, list + 1 };
    list[1] = { 2, list + 2 };
    list[2] = { 3, NULL };
    return list;
}
==>创建了一个三节点结构大小的内存,列表指向内存存储的开头。它的意思是list=&list[0]或*list=list[0],list+1=&(list[1])或*(list+1)=list[1],list+2=&(list[2])或*(list+2)=list[2]

list[0] = (struct node) {1, list +1};
==>是的,你可以这样做。这是我的修改,因为这样做效果很好:

struct node* BuildOneTwoThree() {
    struct node *list = (struct node *)malloc(3 * sizeof(struct node));

    list[0] = { 1, list + 1 };
    list[1] = { 2, list + 2 };
    list[2] = { 3, NULL };
    return list;
}

它返回一个指向
3*sizeof(struct node)
已分配内存字节的指针。为什么我可以使用数组索引对这些指针进行索引?因为
list[I]
相当于
*(list+I)
。在第一次调用中
malloc()
返回的空间足够容纳3个
struct node
的数组,并且指向的内存充分对齐,可以安全地将其强制转换到
结构节点*
,并将其用作3个
结构节点
值的数组。C标准要求保证“充分对齐”。它返回一个指向
3*sizeof(struct node)
字节分配内存的指针。为什么我可以使用数组索引索引这些指针?因为
list[I]
相当于
*(list+I)
malloc()返回的空间第一个调用中的
足够大,可以容纳3个
结构节点的数组
,并且指向的内存充分对齐,可以安全地将其强制转换到
结构节点*
,并将其用作3个
结构节点
值的数组。C标准要求保证“充分对齐”。