Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否有标准的指针大小声明?_C_Pointers_Struct_Standards - Fatal编程技术网

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

C 是否有标准的指针大小声明?,c,pointers,struct,standards,C,Pointers,Struct,Standards,我在char中有带填充的struct(哎呀,我的错)。我想减去指针的大小。你知道一个标准指针大小声明,或者一个标准宏吗?sizeof(void*)你可以直接使用sizeof(void*)。你想要的是C标准的答案,还是几乎一直有效的答案 通常,指向数据的所有指针大小相同,即sizeof(void*) 但是,由于您标记了“C”和“标准”,请注意,这不是C标准所要求的。我认为POSIX需要它,在Win32上也是如此,并且没有一种常见的现代体系结构具有涉及不同大小指针的指令。在一种情况下,指针的大小不同

我在
char
中有带填充的struct(哎呀,我的错)。我想减去指针的大小。你知道一个标准指针大小声明,或者一个标准宏吗?

sizeof(void*)
你可以直接使用
sizeof(void*)

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

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

但是,由于您标记了“C”和“标准”,请注意,这不是C标准所要求的。我认为POSIX需要它,在Win32上也是如此,并且没有一种常见的现代体系结构具有涉及不同大小指针的指令。在一种情况下,指针的大小不同,这就是带有“近”和“远”指针的分段内存体系结构,当然,在任何给定的实现中,C中只有一个指针可以是“普通”指针。另一种情况是,理论上,如果int始终是4对齐的,则指向
int
的指针可能比指向
char
的指针小2位。如果内存空间是64MB,这可能意味着
int*
可以容纳2个字节,而
char*
void*
需要3个字节。因此,C标准允许不同类型使用不同的大小,在本例中是
sizeof(int*)

因此,为了清晰和保证正确性,如果
p
是指针,则其大小为
sizeof p


正如Steve Townsend在他的评论中所说的,如果你再问一个关于你的代码的问题,你可能就能解决你真正的问题。了解指针的大小并不能直接告诉您有关包含指针的结构布局的更多信息。

如果您正在寻找一种以字节为单位查找结构成员偏移量的可移植方法,则需要使用
stddef.h
中定义的
offsetof()
宏:

#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;
}

你为什么不发布你的代码以获得更清晰的反馈?以确保你没有将一个错误叠加在另一个错误之上?在/usr/include中有各种大小的VOID,这是我一直在考虑的事情,但是
VOID*
应该足够大,可以容纳任何其他指针,所以我认为
SIZEOF(VOID*)
在实践中总是有效的。@康拉德:这取决于你所说的“工作”是什么意思。如果您只需要一个至少与任何指针一样大的数字,则有
SIZE_MAX
;-)如果你需要一个特定指针的精确大小……对——我想我只是假设他想要在某个结构或类似的东西中有足够的空间来容纳任意指针类型。(在这种情况下,
void*
成员是有意义的。)
$ ./a.out
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16