【问题标题】:Malloc, and size on 32 bit machinesMalloc,以及 32 位机器上的大小
【发布时间】:2015-02-19 06:10:50
【问题描述】:
#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 位机器怎么办?另外,如果我更换会发生什么 带双 *p 的 int *p 和 (int *)malloc(20) 与 (double *)malloc(20)?

【问题讨论】:

  • 您的问题是“指针的大小是多少”。指针指向的位置对此没有影响;变量具有固定大小。
  • 在我的 64b Ubuntu 上,p 的大小为 8 个字节,...
  • @MattMcNabb 嗯,你的意思是“指针变量有固定大小”吗?
  • @ring0 如果它的 32 位系统大小是 4 个指针,而 64 位它的 8 个指针是正确的。这里他的构建必须是 32 位,即使他的操作系统是 64 位。不是吗?
  • @ring0 不,所有变量。 (它们在创建后不会改变大小)

标签: c memory allocation


【解决方案1】:

你的假设是错误的。 在printf("%d\n", sizeof(p)); 中,您没有打印integer 的大小。您在此处打印 sizeof 'pointer to an integer',在您的情况下为 4 个字节。很可能您会在 32 位机器上得到相同的结果。

现在关于malloc,它分配bytes的数量并返回指向它的指针。所以即使你将指针从int*转换为double*,也会分配相同大小的内存。

【讨论】:

  • .. 和 sizeof 不会告诉你在这两种情况下分配了多少字节
【解决方案2】:

在指针中,所有指针占用四个字节。

因此,当您使用sizeof 进行检查时,即使它是一个字符指针,它也会给出四个字节。如果您需要该指针的值,请像这样使用。

  printf("%d\n", sizeof(p));// It will give the pointer size.

malloc 正在分配给定的字节。它会给出等于所有指针的值。然后不要转换malloc的结果。参考这个link.

【讨论】:

  • 您能解释一下“该指针的总大小”是什么意思吗?
【解决方案3】:

你有什么误会,让我指点一下,

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));

【讨论】:

    【解决方案4】:

    无论是 64 位系统还是 32 位系统,指针变量的大小默认为 4 个字节,因为 64 位构建设置默认也有 Debug32。
    如果我们专门更改 64 位的构建设置,那么指针变量可以容纳 8 个字节。 我假设这是因为整数在内存中占用 4 个字节,而 p 是一个整数指针。

    你的假设不正确!要回答您的疑问,不仅整数指针占用 4 个字节。

    int *ptrint;
    字符 *ptrchar;
    浮动 *ptrfloat;
    双 *ptrdouble;

    这里所有的 ptrint、ptrchar、ptrfloat、ptrdouble 都占用 4 个字节的内存,因为它将是存储在该变量中的地址。

    如果将 int *p 替换为 double *p 并将 (int *)malloc(20) 替换为 (double *)malloc(20) ,则大小仍为 4 个字节。我希望这个答案可以消除您的疑虑。

    【讨论】:

    • 在 64 位机器中,通常所有编译器和默认构建设置都是 32。因此指针变量大小通常为 4 字节。
    • 无论是 64 位系统还是 32 位系统,指针变量的大小都是 4 个字节。 那么显然它不是“无关的”,只有当你有错误的构建设置...
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2013-02-12
    • 2012-09-13
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多