#include<stdio.h>
int main(){
int * ptr=(int *)malloc(40);
printf("%d",sizeof(ptr));
}
当我运行它时,输出为 8...这里发生了什么...为什么输出为 8?
该sizeof
运算符是一个编译时运算符,任何指针的大小在您的机器上都是 8 个字节。
无法检索malloc
-ed 内存区域的动态大小。您必须以其他方式知道它,或者将其保存在某个地方。
您可能会考虑使用Boehm 的保守垃圾收集器,然后您将调用GC_malloc
而不是malloc
,您不需要调用free
(or GC_free
),并且您可以使用GC_size(p)
从(但我不t 建议使用)。GC_malloc
p
GC_size
如果malloc
在 Linux 上使用,学习如何使用valgrind寻找内存泄漏错误,并使用gcc -Wall -g
malloc()
返回一个指向 40 字节内存(可能是 10 个整数)的指针并将其分配给ptr
. 原因sizeof(ptr)
是 8 是因为您使用的是 64 位机器,并且指针大小为 8 个字节。
您应该sizeof()
在内部使用,malloc()
因为它是一种很好的形式,并且在类型改变大小(跨平台或其他)时避免出现问题。如果您真的想要 10 个整数的空间,请使用:
int *ptr = malloc(10 * sizeof *ptr);
这分配了 10 个类型ptr
指向的大小,在本例中为int
. 这样做的好处是您可以更改类型而不更改malloc()
该变量ptr
是一个指向 int 的指针,您的系统恰好有 8 个字节的大小。
ptr 是一个指针。它打印系统上指针的大小。因为 ptr 保存一个地址,所以 8 个字节是在 64 位机器上保存一个地址所需的大小。这是特定于编译器的。您无法检索分配给指针的大小。
如果你有这个疑问,那么你也应该怀疑 free() 如何在不知道分配给指针的大小的情况下释放内存。
我已经在我的 Windows 32 位机器上试过这个,我得到了 4 个字节,我认为 ptr 是一个指向 int 的指针,它显示了正确的