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

the*_*ian 0 c memory malloc pointers 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sou*_*osh 5

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

似乎工作,访问无效的内存是不确定的行为(UB) 。不要那样做

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

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

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

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