我正在尝试使用此代码将20个字节重新分配给已经占用10个字节的整数:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *ptr;
ptr=(int *)malloc(10*sizeof(int));
printf("size before re-allocation : %d bytes",sizeof(ptr));
ptr=(int *)realloc(ptr,20*sizeof(int));
printf("size after re-allocation : %d bytes",sizeof(ptr));
free(ptr);
}
但输出在realloc之前和realloc之后显示为8个字节。 我做错了什么?
答案 0 :(得分:3)
sizeof(ptr)
确定单个整数指针的大小。 sizeof
是在翻译期间静态应用的运算符(可变长度数组除外,但此处并非如此)。静态类型ptr
为int*
,因此您会打印sizeof(int*)
。
sizeof(ptr)
永远不会是sizeof(int[10])
因为数组不是指针,尽管很多教程错误地教导它们。
然而,好消息是,如果malloc
/ realloc
返回除NULL之外的任何地址,那么确实ptr
指向可包含10/20整数的内存。所以你只需要跟踪分配的大小。
但请注意,malloc
及其亲属在程序运行期间进行内存分配,与sizeof
相反(大多数情况下,VLA再次返回)在程序运行之前的结果。