【问题标题】:How does a pointer heap allocation allocate sufficient space for a struct in C?指针堆分配如何为 C 中的结构分配足够的空间?
【发布时间】:2019-10-20 14:40:29
【问题描述】:

以下代码完美编译运行:

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*));)。所以我的问题是,这个结构数据实际存储在哪里,如果它存储在堆上,它是如何工作的?

【问题讨论】:

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


【解决方案1】:

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

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

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

根据个人情况,可能会导致

  • 似乎工作
  • 覆盖其他一些内存位置
  • 产生分段错误
  • 打印贵国国歌
  • 使用您的信用卡为整个团队订购披萨和小马

任何或全部,没有特定的顺序。

【讨论】:

  • 我很欣赏这里的信息。我还有另一个问题——除了潜在的段错误之外,现代操作系统(Windows 10、macOS 等)实际上是否允许通过访问这样的内存而发生任何不好的事情?我听说这会导致随机行为或像你说的那样覆盖,但我从未观察到除了段错误之外的任何实际不良行为。我并不是说这很好,我完全理解并且我尽可能避免使用 UB……但我想知道这是否主要是在嵌入式系统中,操作系统可能无法保护内存,从而可能发生这种坏事。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
相关资源
最近更新 更多