sizeof 指向结构惊喜的指针

问题描述

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

解决方法

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

sizeof(*pfoo);

sizeof(footype);

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

,

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

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

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

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

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