答案 0 :(得分:6)
答案 1 :(得分:4)
答案 2 :(得分:1)
答案 3 :(得分:1)
答案 4 :(得分:0)
答案 5 :(得分:0)
我宁愿使用一些函数来动态分配数据,而是正确地释放它。
使用此技巧只会省去初始化数据结构的麻烦,并可能导致非常糟糕的问题(请参阅Jerry的评论)。
我会做这样的事情:
typedef struct foo {
void *data;
char *comment;
size_t num_foo;
}foo;
foo *alloc_foo( void * data, size_t data_size, const char *comment)
{
foo *elem = calloc(1,sizeof(foo));
void *elem_data = calloc(data_size, sizeof(char));
char *elem_comment = calloc(strlen(comment)+1, sizeof(char));
elem->data = elem_data;
elem->comment = elem_comment;
memcpy(elem_data, data, data_size);
memcpy(elem_comment, comment, strlen(comment)+1);
elem->num_foo = data_size + strlen(comment) + 1;
}
void free_foo(foo *f)
{
if(f->data)
free(f->data);
if(f->comment)
free(f->comment);
free(f);
}
请注意,我没有检查数据有效性,我的alloc可以优化(用存储的长度值替换strlen()调用)。
在我看来,这种行为更安全......可能是传播数据块的代价。