在我看来,struct new_element *element = malloc(sizeof(*element))
创建了一个类型元素的结构,而我认为它只会创建一个指向它的指针。以下代码向我证明我错了:
struct new_element
{
int i;
struct new_element *next;
};
int main(void)
{
struct new_element *element = malloc(sizeof(*element));
element->i = 5;
element->next = NULL;
printf("i = %d, next = %p\n", element->i, element->next);
}
输出:
i = 5, next = (nil);
element->i
的值为5,element->next
的值为NULL
。这是否意味着element
指向一个结构,这意味着是一个已创建的结构?我认为malloc
只会给出一个内存中所需大小的指针。
答案 0 :(得分:10)
变量element
是一个指针。定义它时,会为指针留出空间。
如果你刚刚这样做了:
struct new_element *element;
你已经创建了一个指针。它只是没有指向任何地方。
当您再调用malloc(sizeof(*element))
时,会为element
指向的空间留出足够大的空间,即struct new_element
的实例。然后,将变量element
指向此部分内存。
此语法:
element->i = 5;
与:
相同(*element).i = 5;
取消引用指针element
,为您提供struct new_element
,然后您访问成员i
。
如果您这样做,正如您在评论中所建议的那样:
struct new_element *element = malloc(sizeof(element));
你没有分配适当的空间。您为struct new_element *
而不是struct new_element
留出了足够的空间。如果结构大于指向它的指针(可能在这种情况下,因为它包含指向其自己类型的指针),那么在修改其中一个成员时,您将结束写入已分配内存的末尾。这会调用undefined behavior。