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
检索由 malloc
、calloc
或 realloc
分配的实际大小。 一些malloc
实现具有执行此操作的功能,但它是非标准的。
如果以块为单位分配内存以存储多个对象或数组,则必须在单独的变量或结构成员中自行跟踪分配的空间。
请注意,printf
格式%d
是或int
值。 sizeof
计算结果为一个size_t
值,该值是无符号的,并且可能具有不同的大小。 转换size_t
的标准格式是%zu
:
printf("%zu ", sizeof(*transitions));
如果 C 库不支持 C99 格式说明符,则应使用强制转换:
printf("%lu ", (unsigned long)sizeof(*transitions));