【问题标题】:Incorrect size of a pointer指针大小不正确
【发布时间】:2020-03-02 10:06:28
【问题描述】:

我正在研究指针,发现指针的大小不正确。

我了解到,由于p_num 是一个指向 int 的指针,它应该显示 4 个字节,但实际上显示的是 8 个字节。

可能的原因是什么?

#include <stdio.h>

int main()
{
    int num = 0;
    int * p_num = NULL;

    num = 10;

    printf("num address: %p\n", &num);
    printf("num size: %zd\n", sizeof(num));
    printf("num value: %d\n\n", num);

    p_num = &num;

    printf("p_num address: %p\n", (void*)&p_num);
    printf("p_num size: %zd\n", sizeof(p_num));
    printf("p_num value: %p\n", p_num);
    printf("p_num value pointed: %d\n", *p_num);

    return 0;
}

输出:

num address: 0x7fffcb0e8ffc
num size: 4
num value: 10

p_num address: 0x7fffcb0e8ff0
p_num size: 8
p_num value: 0x7fffcb0e8ffc
p_num value pointed: 10

【问题讨论】:

  • 您使用的是 64 位系统吗?那么指针通常是 64 位(即 8 个字节)。为什么你认为指针应该是 4 字节(32 位)?
  • 指针指向的对象类型与指针的大小无关;指针必须足够大以容纳系统可能使用的任何地址 - 在您的情况下(可能是 64 位系统)大小为 8 个字节。
  • 是的,我在 64 位机器上测试。
  • 我了解到,由于p_num 是指向int 的指针,它应该显示4 个字节 你从哪里了解到的?因为那完全是错误的。
  • 不同的类型有不同的大小。并且“指向int 的指针”(int *)是与int 不同的类型。

标签: c pointers memory size


【解决方案1】:

可能的原因是什么?

指针的大小取决于架构。在 32 位架构上,一个指针在内存中通常占用 4 个字节,在 64 位架构上通常占用 8 个字节。

因此,如果您使用comments 中所说的 64 位架构,那么程序或系统本身没有任何问题。你只是有一个错误的假设:

我学到的是……指向int 的指针……应该显示 4 个字节。

此外,这通常对所有指针类型都有效,而不仅仅是指向int 的指针。它们通常在内存中具有相同的大小,但标准并不要求,正如您在this 中关于该确切问题的答案中的 ISO/IEC 9899:2011 (C11) 的引用中看到的那样。

指针的大小也可能与指针指向的对象的大小不同。所以指针对象的大小和指针指向的对象的大小是不同的。

【讨论】:

    【解决方案2】:

    我了解到,由于 p_num 是一个指向 int 的指针,它应该显示 4 个字节,但显示的是 8 个字节。

    你的假设是错误的。

    int 是一个变量。

    int pointer 是另一个变量。

    所以两个不同的变量并且这两个变量不需要需要具有相同的大小。

    换句话说:

    printf("p_num size: %zu\n", sizeof(p_num));   // Gives you the size of the pointer
    
    printf("p_num size: %zu\n", sizeof(*p_num));  // Gives you the size of the pointed to object
                                       ^
                                       notice the *
    

    在您的情况下,您看到 int 的大小为 4,而 int pointer 的大小为 8。这是完全合法的。

    很可能,您可以通过查看charchar pointer 来使尺寸差异更大。那么您很可能会看到 char 为 1,char pointer 仍为 8。

    【讨论】:

      【解决方案3】:

      sizeof(p_num) 是指针的大小,而不是它所指向的东西的大小。

      sizeof(*p_num) 是它所指向的东西的大小。

      另外,括号是不必要的。 sizeof p_numsizeof *p_num 工作正常。括号仅用于获取类型(而不是表达式)或复杂表达式的大小。

      【讨论】:

        【解决方案4】:

        为了寻址超过 4gb 的内存,指针应该是 8 字节大小。超过 4gb 的内存地址不能用 32 位即 4 字节表示。

        【讨论】:

          【解决方案5】:

          在 64 位机器中,指针的大小是 8 个字节,因为指针是一个内存地址。指针 p_num 指向变量 num,它只是几种整数类型之一。在 64 位系统中,sizeof(int) = 4。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-15
            • 2011-12-14
            相关资源
            最近更新 更多