是否有标准指针大小声明?

时间:2010-11-29 17:33:36

标签: c pointers struct standards

我在char中有填充的结构(哎呀,我的坏)。我想减去一个指针大小。您知道标准指针大小声明,还是标准宏?

4 个答案:

答案 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 *)。