指针堆分配如何为C中的结构分配足够的空间?

时间:2019-06-05 05:08:00

标签: c pointers memory malloc dynamic-memory-allocation

以下代码可以编译并完美运行:

typedef struct n {
    char value;
    struct n* next;
} node;
void insert_new_node(node** head, char new_value)
{
    node* new_node = malloc(sizeof(node*));
    new_node->value = new_value;
    new_node->next = NULL;

    if(*head == NULL)
    {
        *head = new_node;
    }
    else
    {
        node* current = *head;

        while(current->next != NULL)
        {
            current = current->next;
        }

        current->next = new_node;
    }
}

我的问题是-请注意,我实际上只是将用于指针的空间分配给了结构,而不是为结构本身分配了空间(参考:node* new_node = malloc(sizeof(node*));)。所以我的问题是,该结构数据实际存储在哪里?如果存储在堆中,它将如何工作?

1 个答案:

答案 0 :(得分:5)

  

所以我的问题是,此结构数据实际存储在哪里,如果存储在堆中,它将如何工作?

它似乎可以正常工作,访问无效的内存是undefined behavior (UB)。不要那样做。

要详细说明,正如您提到的那样,您仅按指针的大小分配了内存,但是,您正在使用该指针访问超出该边界的内存。在分配的块之外的内存位置未分配给您的程序,因此该内存在您的程序上下文中无效,并且尝试访问该内存是UB。

根据具体情况,可能会导致

  • 出现在工作中
  • 覆盖其他一些内存位置
  • 产生细分错误
  • 打印您所在国家的国歌
  • 使用您的信用卡为整个团队订购比萨饼和小马

任何或全部,无特定顺序。