【问题标题】:sizeof pointer to structure surprisesizeof 指向结构惊喜的指针
【发布时间】:2021-04-21 15:37:17
【问题描述】:
typedef struct {
  char a[5];
  char b[7];
}footype;

void actOnFooishThings(footype *pfoo){
  printf("Address of pfoo = %d\r\n", pfoo);
  printf("Address of pfoo + 1 = %d\r\n", pfoo + 1);
  printf("Size of pfoo = %d\r\n", sizeof(pfoo));
  return;
}

void main() {
  footype bar;
  printf("Size of bar = %d\r\n", sizeof(bar));
  actOnFooishThings(&bar);
}

输出:

Size of bar = 12
Address of pfoo = 537394080
Address of pfoo + 1 = 537394092
Size of pfoo = 4

由于向 pfoo 添加 1 产生了我预期的结果(基地址前 12 个字节),我很惊讶 sizeof 没有导致“12”。我理解“4”。它告诉我指针变量的大小,但它似乎与 pfoo + 1 结果不一致。 如何检索指针 pfoo 的大小?我会做一些像 (pfoo + 1) - pfoo 这样的傻事吗?

【问题讨论】:

  • 请解释您认为这表明的不一致之处。
  • 将不正确类型的值传递给printf()的未定义行为。
  • 指针的大小和它所指向的大小之间没有任何关系。对您的结构进行成像实际上是一兆字节。您是否认为任何指向该结构的指针也必须消耗一兆字节的存储空间?
  • @user1160866 比较 sizeof(pfoo)sizeof(*pfoo)。这就是sizeof(footype*)sizeof(footype) 之间的区别。
  • 对不起,“我如何检索指针 pfoo 的大小?”对于确定指针指向的大小的问题,这不是一个明确的措辞。这与您在这里提出的问题不同。不过,我确实很欣赏@dxiv,因为它检测到了您的意思。我可以提议为此创建一个单独的问题吗?

标签: c pointers structure sizeof


【解决方案1】:

所有的 cmets 都非常有指导意义。谢谢你。用户 Dxiv 给出了我正在寻找的响应。 我试图做的“正确”语法是:

sizeof(*pfoo);

sizeof(footype);

感谢用户 Yunnosch 指出我的问题措辞不正确。我希望我能被原谅,因为我在发帖时的知识在提出问题后缺乏现在的知识。问题应该是“如何确定 pfoo 指向的数据类型的大小?”

【讨论】:

  • 好主意,通过回答解释你在问题中的意思并回答它来消除这里的误解,但不要改变现有答案的问题。我对这种妥协的尊重比提出一个单独的问题要简单。我会牢记这个想法,以备不时之需。 (要清楚,这是诚实的意思,没有玩世不恭或任何意图。)
  • 我认为您甚至可以接受自己的答案。 stackoverflow.com/help/someone-answers
  • 在您发表评论后,我编辑了我的答案。编辑好了吗?
  • 之前已经是一个很好的(在我看来是可投票的)答案。当然,我很高兴您对我的贡献表示赞赏。通过明确解释所问问题和本意问题之间的区别,答案可能会变得更好。但是,我不能再次投票,抱歉。 ;-)
  • 注意:() 不需要 sizeof(*pfoo);
【解决方案2】:

指针指向的大小与指针的大小无关。

在大多数环境中,由sizeof(anypointer) 确定的指针大小在给定环境中甚至总是相同(通常为4,对于某些环境为8),与它指向的内容无关。 IE。指向int 的指针的大小与指向char 的指针和指向您的结构类型的指针相同。
指针指向的内容与指针本身的大小无关。
您的 pfoo 是一个指针。
你的bar不是,它是结构体类型footype的变量,它的大小是12。

顺便说一句,正如 cmets 所指出的,您使用了错误的格式说明符进行打印,但这与您的尺寸实验无关。

正如 M.M 所指出的,在给定环境中指针始终具有相同大小在理论上并不严格,尽管适用于大多数当前系统。编译器可以有不同大小的指向不同类型的指针。
正如 chux 所提到的,我认为在讨论指向普通数据的指针大小时,观察到的函数指针大小和对象指针大小之间的差异超出了讨论范围。

关键是,指针指向的大小与指针的大小无关。

【讨论】:

  • 不知道,是理论还是有真实案例?
  • "还是有真实案例?"我在 2021 年经常看到它,指向函数的指针和指向对象的指针之间存在指针大小差异。
  • 只是想添加几个 cmets 来解决 Yunnosch 的回答。首先,是的,我了解指针变量的大小。这不是我要问的。 dxiv 回答了我的问题,提到 sizeof(*pfoo) 会按我的预期工作。除此之外,是的,我知道我的 printf 语句不是很好。我只是想编写伪代码以免分散我的主要问题。谢谢大家!
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多