2016-02-28 57 views
1
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(*转换)ist 16和sizeof(TRANSITION)ist 16.现在我想要转换有32个大小的内存。realloc-call后没有变化

的问题是,如果我这样做:

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

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

+0

'* transitions'是一个顶级元素。 – BLUEPIXY

+3

结构的大小在编译时是固定的。 '的sizeof(*跃迁)'意味着完全一样'的sizeof(过渡)' –

+1

与往常一样,你应该张贴在你的代码片段中使用的所有类型的定义。 'transitions-> destination =(struct STATE *)destination;'中的转换可能是不必要的。 – chqrlie

回答

3

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

有些'sizeof'表达式在运行时被评估(不是这个) –

+0

@MM:一些'sizeof'表达式的确在运行时被评估:'sizeof(char [random()])'调用了'random ()'函数,但施加到物体'sizeof',相对于一个类型,计算结果为要么是一个编译器的时间常数,或者被计算为对象实例化(对于VLAS)的一部分的值。这似乎不是这种情况,但类型定义丢失。 – chqrlie