sizeof 指向结构惊喜的指针

sizeof pointer to structure surprise

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 这样的傻事吗?

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

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

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

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

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

所有的评论都非常有启发性。谢谢你。用户 Dxiv 给出了我正在寻找的响应。 我试图做的“正确”语法是:

sizeof(*pfoo);

sizeof(footype);

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