【问题标题】:What is the reason for size of a pointer to a 2d array being 8 on gcc 4.2.1?在 gcc 4.2.1 上指向 2d 数组的指针大小为 8 的原因是什么?
【发布时间】:2015-02-16 09:13:44
【问题描述】:

这是一个c程序

#include<stdio.h>
main()
{
 int(*p)[3][4];
 printf("size of p= %d",sizeof(p));
 printf("size of *p= %d",sizeof(*p));
 return 0;
}

我可以理解 (*p) 的大小应该是数组的总大小,在这种情况下是 48 个字节。 但是 gcc 版本 4.2.1 给出了 p = 8 的大小。 为什么?

【问题讨论】:

  • 据我所知,在 64 位机器上指针的大小始终为 8 个字节,因为它存储一个大小为 8 个字节的地址。
  • 你真的想知道为什么 sizeof(p) 是 8 吗?那么@user2225104 的回答是正确的。如果您想知道为什么 sizeof(*p) 是 8,那么您并不孤单。为什么不贴示例程序运行终端输出?
  • 我的回答总是正确且切中要害。只有一些缺乏文本阅读技巧并投票否决他们;)
  • 附带说明,有多种 x64 内存模型。不同的操作系统选择不同的型号。虽然在 x64 上,指针的大小始终为 64 位,但操作系统选择的内存模型决定了 int 和 long 的大小。此外,这取决于 CPU,实际使用了 64 个地址位中的多少。
  • @Samik 谢谢。我忘了我是在 64 位系统上工作的。

标签: c arrays pointers gcc


【解决方案1】:

指针存储它所指向的数据的地址。指针变量的大小始终为 8。

sizeof(*p) = 48
sizeof(p) = sizeof(&(*p)) = 8

PS:8 字节大小仅适用于 64 位系统。在 32 位系统中为 4 个字节,在 16 位系统中为 2 个字节。

【讨论】:

    【解决方案2】:

    因为指针的值是地址,所以它的值不等于它所指向的值。否则指针将不是指针,它们只是常规变量,因此无用。

    如果你有一台 64 位机器,那么指针的大小将始终为 8 字节。

    编辑:如果你想知道为什么sizeof(*p)8,那是因为*p 计算为它指向的元素数组中的第一个(除非你增加它)元素。所以*p = p[0]*(p+n) = p[n],等等

    所以sizeof(*p) 总是等于p 指向的类型的大小。

    【讨论】:

    • 这是“why sizeof(*p) is 8”的错字吗?
    • 只是为了清楚地说明这一点:对于 OP 的源 sizeof *p 不是 8sizeof p8
    【解决方案3】:

    当你说声明是int(*p)[3][4], 您实际上的意思是将p 声明为指向4int 类型的数组3 的指针。这里p 是一个指针,在你的64 位机器上指针的大小是8

    最好是sizeof(p) == 8 & sizeof(*p) == 48

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-02
      • 2012-08-13
      • 1970-01-01
      • 2014-07-22
      • 2017-02-07
      • 2011-12-16
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多