c - 对堆上结构使用结构初始化语法

标签 c struct initialization heap-memory

我有一个简单的结构,我想在堆上初始化并在函数中作为指针返回。

struct entry {
    const char* const key; // We don't want the key modified in any way
    const void* data;      // But the pointer to data can change
    struct entry* next;
};

有一个问题,我不能 calloc 它并一一初始化成员,因为 key 是一个 const 指针。我在某个地方发现了这种有效的语法:

struct entry* entry = calloc(1, sizeof(struct entry));
*entry = (struct entry) { .key = key, .data = data, .next = NULL };

但我不知道它发生了什么:它是否创建了一个“匿名”结构,然后将其复制到 *entry 所在的位置?使用它是否安全,或者我应该更喜欢创建一个本地结构,然后使用 memcpy 将其复制到正确的位置?

最佳答案

您提交的作业不正确,不应编译。

使用 const 成员初始化分配的结构的正确方法是分配一些内存,创建一个临时结构条目对象,然后使用 memcpy 将该对象复制到分配的内存中:

void* mem = malloc( sizeof( struct entry ) );
struct entry temp = { key , data , NULL };
memcpy( mem , &temp , sizeof( temp ) );
struct entry* e = mem;

关于c - 对堆上结构使用结构初始化语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39011996/

相关文章:

c - 打印标题层次结构

c++ - 共享内存中的 vector 结构

c - 需要帮助理解功能逻辑

ruby - 了解 Ruby 中初始化时分配的变量的访问

java - 如何在 ActionListener 中初始化局部变量? - java

c - Unix 信号量问题

c - 不同的编码风格如何缩进 switch case?

c - 非常基本,尝试从带有数字的文本文件中读取并将它们存储在数组中

c - 如何消除结构体中的重复项,并使用 qsort 在 C 中对它们进行排序

当输入负数时,Java 找到最小的数字会出现困惑