代码之家  ›  专栏  ›  技术社区  ›  elmarco

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

  •  3
  • elmarco  · 技术社区  · 14 年前

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

    4 回复  |  直到 14 年前
        1
  •  8
  •   nmichaels    14 年前

    sizeof (void *)

        2
  •  8
  •   Steve Jessop    14 年前

    你想要C标准答案,还是一直有效的答案?

    通常,指向数据的所有指针大小相同,即 sizeof(void*) .

    但是,由于您标记了“C”和“Standards”,请注意,C标准不要求这样做。我认为它是POSIX所必需的,在Win32上也是如此,而且没有一个常见的现代体系结构具有涉及不同大小指针的指令。一个场景中,您有不同大小的指针,它是带有“near”和“far”指针的分段内存结构,当然,在任何给定的实现中,在C中只有一个指针是“plain”指针。另一种情况,理论上是指 int 可能比指针小2位 char ,如果int总是4对齐。如果内存空间是64MB,这可能意味着 int* 适合2字节,而 char* void* 要求3。所以C标准允许不同类型的不同尺寸,在这种情况下 sizeof(int*) < sizeof(char*) .

    因此,为了清楚起见,如果 p 是指针,则其大小为 sizeof p .

    正如SteveTownsend在他的评论中所说的,如果你对你的代码提出另一个问题,你可能会解决你真正的问题。知道指针的大小 直接告诉您关于包含指针的结构的布局。

        3
  •  2
  •   SiegeX    14 年前

    如果要查找结构成员的偏移量(以字节为单位),请使用 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
    
        4
  •  1
  •   Huang F. Lei    14 年前

    您可以直接使用sizeof(void*)。