【问题标题】:Trouble in understanding a line of code in c无法理解c中的一行代码
【发布时间】:2016-06-23 10:32:52
【问题描述】:

我正在做一个练习,这是一段代码:

typedef struct node 
{
    size_t size;
    struct node *next;
} node_t;

byte heap[SIZE];

node_t *node_list;

void heap_init()
{
    node_list = (node_t*) heap;
    node_list->size = SIZE;
    node_list->next = NULL;
}

但我在理解这条线时遇到了一些麻烦:

node_list = (node_t*) heap;

【问题讨论】:

  • 题外话:和平->一块。
  • 这是未定义的行为,因为 heap 可能未正确对齐 node_t。它也违反了严格的别名规则

标签: c pointers casting


【解决方案1】:

heap 是大小为 SIZE 的字节数组。

node_listnode_t 类型的指针。该指针分配给数组heap 的第一个字节。这样做的目的是将node_list 分配给已分配的内存位置。

我猜测列表的下一个指针将被分配到该数组更远的位置。

这很可能是在全局变量中模拟堆,避免使用某些嵌入式系统无法使用的malloc

【讨论】:

    【解决方案2】:

    代码使用为heap 分配的内存来存储node_t 实例,而不是使用malloc 函数学校之一分配它。

    变量heap 自身降级为指向byte* 的指针,代码显示“我想将byte* 重新解释为node_t* 指针”。

    请注意,要使其正常工作,SIZE 的值必须至少为 sizeof(node_t),否则 node_t 实例将不适合 heap 变量。

    【讨论】:

      【解决方案3】:

      您指向的代码似乎使用了分配内存不太常见的方法,即作为字节数组.. 而不是 malloc 或 calloc 的常用方法

      现在

      node_list = (node_t*) 堆;

      从这一行可以推断的是 因为 heap 在这里是一个字节数组,并且

      node_liststruct node 类型的 pointer 指向您的 起始地址 >byte 数组 命名为 heap 并且由于指针将是 byte* 类型,它被类型转换为 struct node* 类型。

      可以像这样推断 struct node * ptr = (struct node*) malloc(sizeof(struct node));

      这里 (struct node*) 用在 malloc(sizeof(struct node)); 前面对 malloc 返回的 void 类型的指针进行类型转换,以匹配 '=' 等号左侧所需的 struct node 类型。

      希望对你有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 2015-08-22
        • 2020-10-23
        • 2018-06-15
        • 1970-01-01
        相关资源
        最近更新 更多