我正在浏览SO,发现一些代码向我提出了一个问题。
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;};
struct node *list = malloc(3 * sizeof(struct node));
==>创建了三个节点结构大小的存储器,并且列表指向存储器存储的开头。它表示列表=&列表[0
] 或 *列表 = 列表[0], 列表+1=&(列表[1]( 或 *(列表+1(=列表[1], 列表+2=&(列表[2]( 或 *(列表+2(=列表[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;
}
malloc
返回指向具有指定大小的内存区域的指针。
参数3 * sizeof(struct node)
说区域大小能够存储 3 个node
结构。
数组中的指针和索引是可以互换的,如本答案中所述。