#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p;
p = (int *)malloc(20);
printf("%d\n", sizeof(p));
free(p);
return 0;
}
在我的64位计算机上,打印4作为p的大小。我假设这是因为整数在内存中占用4个字节,而p是一个整数指针。如果我在运行32位机器怎么办?此外,如果我更换会发生什么 int * p with double * p 和 (int *)malloc(20)with(double *)malloc(20)?
答案 0 :(得分:0)
你错了。
在printf("%d\n", sizeof(p));
中,您的打印尺寸不是integer
。您在此处打印sizeof&#39;指向整数的指针&#39;在你的情况下是4个字节。大概你可能会在32位机器上得到相同的结果。
现在大约malloc
,它分配bytes
的数量并返回指向它的指针。即使你将指针从int*
转换为{{1},也将分配相同大小的内存}}
答案 1 :(得分:0)
在指针中,所有指针都需要四个字节。
因此,当您使用sizeof
进行检查时,即使它是一个字符指针,它也会提供四个字节。如果你需要那个指针的值就像这样使用。
printf("%d\n", sizeof(p));// It will give the pointer size.
malloc
正在分配给定的字节。并且它将等于所有指针。然后不要投射malloc
的结果。请参阅此link.
答案 2 :(得分:0)
无论是64位系统还是32位系统,默认情况下,指针变量的大小为4个字节,因为默认情况下64位构建设置也有Debug32。 如果我们专门更改64位的构建设置,那么指针变量可以容纳8个字节。 我假设这是因为整数在内存中占用4个字节,而p是一个整数指针。
你的假设不正确!为了回答你的疑问,不仅整数指针占用4个字节。
int * ptrint;
char * ptrchar;
float * ptrfloat;
double * ptrdouble;
这里所有ptrint,ptrchar,ptrfloat,ptrdouble占用4个字节的内存,因为它是存储在该变量中的地址。
如果用double * p和(int *)malloc(20)替换int * p和(double *)malloc(20),则大小仍然是4个字节。我希望这可以解决你的疑虑。
答案 3 :(得分:0)
你有一些误解让我指出,
p = (int *)malloc(20);
您正在分配20个字节的内存,malloc
返回一个void指针,但编译器会为您执行转换,并且不需要(int *)。即使你有一个指向double
或int
的指针,它也需要相同的字节数(在32位系统中,这只是为了映射4GB的内存空间)。
// Should this be 4 or 8?
printf("%d\n", sizeof(p));
如果您的可执行文件或版本仅为x64,则在x64平台上应为8。我假设您的构建是32位,它返回4.
高于printf
的说明符错误。 sizeof
返回size_t
而不是int
。所以正确的形式应该是,
printf("%zu\n", sizeof(p));