2016-07-07 41 views
1

如果没有意义,请随意编辑标题。所以我一直在使用malloc一段时间没有真正完全确定它的工作原理。如果我创建一个int指针并将其设置为malloc(10*sizeof(int),我认为它在内存中分配了一个int大小的10倍的块,然后返回此分配的起始地址,但是没有任何内容在该内存中实际初始化。我到目前为止还好吗?如果你malloc一个struct *它创建局部变量吗?

现在说我这样创建的链接列表节点结构:

typedef struct node_ { 
    int data; 
    struct node_ *next; 
} Node; 

,然后有一个创建链接列表功能:

Node* LLCreate(int data) { 
    Node *head = malloc(sizeof(Node)); 
    if (head != NULL) { 
     head->next = NULL; // don't get how malloc created `next` 
     head->data = data; // or `data` 
    } 
    return head; 
} 

什么我不明白,并能”如果head只是内存中一个大小为Node的空块的起始位置,而不是实际变量,那么它是如何具有nextdata的局部变量?

也许这是一个无意义的问题,因为我对这里发生的事情有一些基本的误解,但是如果任何人明白我想问什么,并且可以为我解决这个问题,我会非常感激。

+1

'head'是指向*(即*的*地址)* malloc全部内存的内存的*指针。 –

+1

变量只是一个存储区域(加上一个类型)。 “变成一个变量”没有什么不可思议的。 –

+0

所以malloc实际上在内存中创建了struct,它不仅仅为它分配空间? – Austin

回答

2

它没有像nextdata这样的局部变量。

nextdata仅用于计算相对于node指向的地址。

当你做node->data那么地址计算为address pointed by node + (total bytes required by any metadata for malloc) + 0,因为datanode结构的第一个成员。

当你这样做node->next那么地址计算为address pointed by node + (total bytes required by any metadata for malloc) + sizeof(data),因为next是后data成员自带的node结构的第二个成员。

+0

感谢这正是我需要阅读! – Austin

相关问题