realloc-call 后没有变化

No change after realloc-call

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。现在我想让 transitions 有 32 大小的内存。

问题是如果我这样做:

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

transitions的大小还是16,为什么不是32?

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

如果您在块中分配内存以存储多个对象或数组,您必须自己跟踪分配的 space,在单独的变量或结构成员中。

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

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

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

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