我有一个简单的结构,我想在堆上初始化并在函数中作为指针返回。
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/