0
#include<stdio.h>
int main(){
    int * ptr=(int *)malloc(40);
    printf("%d",sizeof(ptr));
}

当我运行它时,输出为 8...这里发生了什么...为什么输出为 8?

4

5 回答 5

2

sizeof运算符是一个编译时运算符,任何指针的大小在您的机器上都是 8 个字节。

无法检索malloc-ed 内存区域的动态大小。您必须以其他方式知道它,或者将其保存在某个地方。

您可能会考虑使用Boehm 的保守垃圾收集器,然后您将调用GC_malloc而不是malloc,您不需要调用free(or GC_free),并且您可以使用GC_size(p)从(但我不t 建议使用)。GC_mallocpGC_size

如果malloc在 Linux 上使用,学习如何使用valgrind寻找内存泄漏错误,并使用gcc -Wall -g

于 2013-02-26T07:03:34.337 回答
2

malloc()返回一个指向 40 字节内存(可能是 10 个整数)的指针并将其分配给ptr. 原因sizeof(ptr)是 8 是因为您使用的是 64 位机器,并且指针大小为 8 个字节。

您应该sizeof()在内部使用,malloc()因为它是一种很好的形式,并且在类型改变大小(跨平台或其他)时避免出现问题。如果您真的想要 10 个整数的空间,请使用:

int *ptr = malloc(10 * sizeof *ptr);

这分配了 10 个类型ptr指向的大小,在本例中为int. 这样做的好处是您可以更改类型而不更改malloc()

于 2013-02-26T07:04:48.297 回答
0

该变量ptr是一个指向 int 的指针,您的系统恰好有 8 个字节的大小。

于 2013-02-26T07:03:56.357 回答
0

ptr 是一个指针。它打印系统上指针的大小。因为 ptr 保存一个地址,所以 8 个字节是在 64 位机器上保存一个地址所需的大小。这是特定于编译器的。您无法检索分配给指针的大小。

如果你有这个疑问,那么你也应该怀疑 free() 如何在不知道分配给指针的大小的情况下释放内存。

于 2013-02-26T07:04:30.117 回答
0

我已经在我的 Windows 32 位机器上试过这个,我得到了 4 个字节,我认为 ptr 是一个指向 int 的指针,它显示了正确的

于 2013-02-26T07:46:26.203 回答