声明一个指向struct的指针会创建一个struct?

时间:2017-06-14 12:42:50

标签: c pointers struct

在我看来,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只会给出一个内存中所需大小的指针。

1 个答案:

答案 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