realloc调用后没有更改
新的_大小是32,因为sizeof(*transitions)ist 16和sizeof(TRANSITION)ist 16。现在我想让转换具有32大小的内存 问题是,如果我这样做: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;
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-intransitions->destination=(结构状态*)destination
可能是不必要的。为什么sizeof(*transitions)应该是32?一些sizeof
表达式是在运行时计算的(虽然不是这一个)@M.M:一些sizeof
表达式确实是在运行时计算的:sizeof(char[random()])
确实调用了random()
函数,但是与类型相反,应用于对象的sizeof
的计算值要么是编译器时间常数,要么是作为对象实例化的一部分计算的值(对于VLAs)。这里的情况似乎不是这样,但是缺少类型定义。
printf("%lu ", (unsigned long)sizeof(*transitions));