c语言中实现这样一个需求,根据某个key值查询到一个value值,这个value值的长度是不固定的,这种情况下怎样设计代码更合理一些,我想到了几种方法:
1.在查询函数内部根据申请到的长度,申请一段内存。
2.在查询函数外部给定一个足够长的内存,然后传递到查询函数中。
3.查询函数使用过程中必须调用两次,第一次仅仅返回查询到数据长度,在外部申请一段内存,然后再调用一次,获取查询到数据。
c语言中实现这样一个需求,根据某个key值查询到一个value值,这个value值的长度是不固定的,这种情况下怎样设计代码更合理一些,我想到了几种方法:
1.在查询函数内部根据申请到的长度,申请一段内存。
2.在查询函数外部给定一个足够长的内存,然后传递到查询函数中。
3.查询函数使用过程中必须调用两次,第一次仅仅返回查询到数据长度,在外部申请一段内存,然后再调用一次,获取查询到数据。
如果你不能用C++的话。。。
可以参考Windows内核中的RtlAnsiStringToUnicodeString
方法。既可以先使用RtlAnsiStringToUnicodeSize
查询长度然后预先开内存,也可以让RtlAnsiStringToUnicodeString
自己开内存,但之后必须调用相关的RtlFreeUnicodeString
进行释放。
在C++中,可以使用RAII,在离开作用域的时候自动清理绑定到栈上对象的资源,此时就可以在函数内分配内存,而执行到呼叫者代码块外时自动释放内存。不用惦记着给每个对象写清理代码。
如果用C的话,可以考虑用GCC编译器,它提供了cleanup属性。用cleanup修饰的变量在离开其作用域的时候,GCC会呼叫指定的清理函数。
static inline void clean_ptr(char *p) { if (p) free(p); }
#define autoclean_pchar __attribute__((cleanup(clean_ptr))) char*
void foo(){
autoclean_pchar value = get_value(key); // get_value分配内存
/* ... 其他代码 ... */
}
//函数返回时自动free内存
cleanup: https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
我见过的有三种:
K-V 的话,可以参考一下 gdbm,它使用的是第二种。