此解决方案使用以 NULL 结尾的查找表 (LUT) 来查找合适的大小。然后分配该大小的内存。然后将输入数据复制到新对象。如果对象类型的数量足够大,则可以对 LUT 进行预排序,然后执行二进制搜索而不是线性搜索。
#include<stdlib.h>
#include<string.h>
struct nameToSize_s {
const char *name;
size_t size;
};
struct foo1_name_s {
};
struct foo2_name_s {
};
const struct nameToSize_s nameToSizeLUT[] = {
{ "foo1_name", sizeof(struct foo1_name_s) },
{ "foo2_name", sizeof(struct foo2_name_s) },
// NULL terminator
{ NULL, 0}
};
void * update(char* name, void *data) {
const struct nameToSize_s *entry = nameToSizeLUT;
while(entry->name) {
if( strcmp(entry->name, name) == 0) break;
entry++;
}
if( entry->name == NULL) abort();
void *newObj = malloc(entry->size);
if( newObj == NULL) abort();
return memcpy( newObj, data, entry->size);
}