Malloc,32位机器的尺寸

时间:2015-02-19 06:10:50

标签: c memory allocation

#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)?

4 个答案:

答案 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 *)。即使你有一个指向doubleint的指针,它也需要相同的字节数(在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));