问题描述
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 所提到的,我认为在讨论指向纯数据的指针大小的范围之外,我不考虑函数指针大小和对象指针大小之间观察到的差异。
重点是,指针指向的大小与指针的大小无关。