c - 捆绑 Malloc 调用

标签 c memory-management linked-list malloc nodes

我正在浏览 SO 并找到了 some code这向我提出了一个问题。

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));

==> 创建了一个三节点结构大小的内存,列表指向内存存储的开始。意思是list=&list[0] or *list = list[0], list+1=&(list[1]) or *(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;
}

关于c - 捆绑 Malloc 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54527635/

相关文章:

Python itertool 变体,达到内存最大值

ios - Unwind segue 不会释放我的 View Controller

java - 如何在Java中为单向链表节点高效实现hashCode()?

c++ - 循环依赖问题链表

c - 在链接时找出外部变量的位置

c - 将 getline 的输入按空格分解为字符指针数组

c管道为什么是fd[0]和fd[1] 3和4

c - 将地址传递给 C 中的函数

c++ - 我的 C++ 析构函数中出现双重释放或损坏 (!prev) 错误

c - C中不兼容指针类型的赋值