是的,hack 的总体思路是有效的,但至少在我阅读时,您还没有完全正确地实现它。你做对了这么多:
f = malloc(num + sizeof(foo) + MAX_COMMENT_SIZE );
f->data = f + 1; // is this OK?
但这是错误的:
f->comment = f + 1 + num;
因为f 是foo *,所以f+1+num 是根据sizeof(foo) 计算的——也就是说,它相当于说f[1+num]——它(尝试)索引到1+numthfoo 在一个数组中。我很确定这不是你想要的。当你分配数据时,你传递了sizeof(foo)+num+MAX_COMMENT_SIZE,所以你分配空间的是num chars,你(大概)想要的是将f->comment指向内存中的一个位置num char s 在f->data 之后,会更像这样:
f->comment = (char *)f + sizeof(foo) + num;
将f 转换为char * 会强制按照chars 而不是foos 来完成数学运算。
OTOH,由于您总是为comment 分配MAX_COMMENT_SIZE,我可能会(相当)简化一些事情,并使用这样的东西:
typedef struct foo {
char comment[MAX_COMMENT_SIZE];
size_t num_foo;
char data[1];
}foo;
然后像这样分配它:
foo *f = malloc(sizeof(foo) + num-1);
f->num_foo = num;
它可以在没有任何指针操作的情况下工作。如果你有 C99 编译器,你可以稍微修改一下:
typedef struct foo {
char comment[MAX_COMMENT_SIZE];
size_t num_foo;
char data[];
}foo;
并分配:
foo *f = malloc(sizeof(foo) + num);
f->num_foo = num;
这具有标准实际上祝福它的额外优势,尽管在这种情况下优势很小(我相信带有data[1] 的版本将适用于现有的每个 C89/90 编译器)。