如果标题没有意义,请随意编辑标题。所以我一直在使用malloc
一段时间而没有完全确定它是如何工作的。如果我创建一个int指针并将其设置为等于malloc(10*sizeof(int)
,我认为它在内存中分配了一个int大小的10倍的块,然后返回此分配的起始地址,但实际上没有任何内容初始化那个记忆呢。我到目前为止好吗?
现在说我为链表节点创建一个结构,如下所示:
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
的空块的内存中的起始位置,而不是实际的,那么我无法获得并且似乎无法正确使用谷歌变量,它如何具有next
和data
的局部变量?
也许这是一个荒谬的问题,因为我对这里发生的事情有一些根本的误解,但是如果有人理解我想要问的内容并且可以为我清楚这一点,我真的很感激。
答案 0 :(得分:2)
它没有像next
和data
这样的局部变量。
next
和data
仅用于计算相对于node
指向的地址。
执行node->data
后,地址计算为address pointed by node + (total bytes required by any metadata for malloc) + 0
,因为data
是node
结构的第一个成员。
当您执行node->next
时,地址计算为address pointed by node + (total bytes required by any metadata for malloc) + sizeof(data)
,因为next
是node
之后的data
结构的第二个成员构件。