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