realloc调用后没有更改

realloc调用后没有更改,c,memory-management,realloc,C,Memory Management,Realloc,新的_大小是32,因为sizeof(*transitions)ist 16和sizeof(TRANSITION)ist 16。现在我想让转换具有32大小的内存 问题是,如果我这样做: TRANSITION *transitions = malloc(sizeof(TRANSITION)); STATE *destination = malloc(sizeof(STATE)); transitions->destination = (struct STATE *) destination;

新的_大小是32,因为sizeof(*transitions)ist 16和sizeof(TRANSITION)ist 16。现在我想让转换具有32大小的内存

问题是,如果我这样做:

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);

转换的大小仍然是16。为什么不是32?

编译时计算
sizeof
运算符。它的值是操作数类型的大小。您不能使用
sizeof
检索由
malloc
calloc
realloc
分配的实际大小。一些
malloc
实现具有这样做的功能,但它是非标准的

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

请注意,
printf
格式
%d
是或
int
sizeof
计算为一个
size\u t
值,该值无符号,可能大小不同。转换
大小的标准格式为
%zu

printf("%d  ", sizeof(*transitions));
如果您的C库不支持C99格式说明符,您将使用强制转换:

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

*transitions
是顶层元素。结构的大小在编译时是固定的
sizeof(*transitions)
的意思与
sizeof(TRANSITION)
完全相同,您应该发布代码片段中使用的所有类型的定义。cast-in
transitions->destination=(结构状态*)destination
可能是不必要的。为什么sizeof(*transitions)应该是32?一些
sizeof
表达式是在运行时计算的(虽然不是这一个)@M.M:一些
sizeof
表达式确实是在运行时计算的:
sizeof(char[random()])
确实调用了
random()
函数,但是与类型相反,应用于对象的
sizeof
的计算值要么是编译器时间常数,要么是作为对象实例化的一部分计算的值(对于VLAs)。这里的情况似乎不是这样,但是缺少类型定义。
printf("%lu  ", (unsigned long)sizeof(*transitions));