C语言 重新定位调用后没有变化


TRANSITION *transitions = malloc(sizeof(TRANSITION));
STATE *destination = malloc(sizeof(STATE));
transitions->destination = (struct STATE *) destination;
int new_size = sizeof(*transitions) + sizeof(TRANSITION);
printf("%d  ", new_size);
transitions = realloc(transitions, new_size);

new_size是 32,因为 sizeof(*transitions) ist 16 和 sizeof(TRANSITION) ist 16。现在我想让过渡具有 32 大小的内存。

问题是,如果我这样做:

printf("%d  ", sizeof(*transitions));

过渡的大小仍然是 16。为什么不是32?

sizeof运算符在编译时计算。 其值是操作数类型的大小。 不能使用 sizeof 检索由 malloccallocrealloc 分配的实际大小。 一些malloc实现具有执行此操作的功能,但它是非标准的。

如果以块为单位分配内存以存储多个对象或数组,则必须在单独的变量或结构成员中自行跟踪分配的空间。

请注意,printf格式%d是或int值。 sizeof计算结果为一个size_t值,该值是无符号的,并且可能具有不同的大小。 转换size_t的标准格式是%zu

printf("%zu  ", sizeof(*transitions));

如果 C 库不支持 C99 格式说明符,则应使用强制转换:

printf("%lu  ", (unsigned long)sizeof(*transitions));

最新更新