我在char
中有填充的结构(哎呀,我的坏)。我想减去一个指针大小。您知道标准指针大小声明,还是标准宏?
答案 0 :(得分:8)
sizeof (void *)
答案 1 :(得分:8)
你想要C标准答案,或者答案几乎一直都有效吗?
通常,所有指向数据的指针都是相同的大小,即sizeof(void*)
。
但是,由于您标记了“C”和“标准”,请注意C标准不要求这样做。我认为这是POSIX所要求的,并且在Win32上也是如此,并且没有一个常见的现代架构具有涉及不同大小指针的指令。你有不同大小的指针的一个场景是带有“near”和“far”指针的分段内存架构,当然在任何给定的实现中,其中只有一个可以是C中的“普通”指针。另一种情况是,理论上指向int
的指针可能比指向char
的指针小2位,如果int总是4对齐的话。如果内存空间是64MB,则可能意味着int*
适合2个字节,而char*
或void*
需要3.因此C标准允许不同的大小类型,在本例中为sizeof(int*) < sizeof(char*)
。
因此,为了清晰起见和保证正确性,如果p
是指针,则其大小为sizeof p
。
正如Steve Townsend在评论中所说,如果你问另一个关于你的代码的问题,你可能会解决你的真正问题。知道指针的大小不会直接告诉你很多关于包含指针的结构的布局。
答案 2 :(得分:2)
如果您正在寻找一种可移植的方法来查找结构成员的偏移量(以字节为单位),那么您希望使用offsetof()
中定义的stddef.h
宏:
#include <stdio.h>
#include <stddef.h>
int main(void)
{
struct s {
int i;
char c;
double d;
char a[];
};
/* Output is compiler dependent */
printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
(long) offsetof(struct s, i),
(long) offsetof(struct s, c),
(long) offsetof(struct s, d),
(long) offsetof(struct s, a));
printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));
return 0;
}
$ ./a.out
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16
答案 3 :(得分:1)
您可以直接使用sizeof(void *)。