24

为什么是sizeof空指针2

4

5 回答 5

50

a 的大小void*是依赖于平台的值。通常,对于 32 位和 64 位平台,它的值分别为 4 或 8 个字节。如果您得到 2 作为值,那么您可能在 16 位编码平台上运行(或可能有编码错误)。

您能否发布您正在使用的代码以及有关您的环境/操作系统的更多信息?

于 2010-10-04T07:26:16.667 回答
9

根据在线 C 标准(n1256 草案)

6.2.5 类型
...
27 指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。39) 同样,指向兼容类型的合格或不合格版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有彼此相同的表示和对齐要求。所有指向联合类型的指针都应具有彼此相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。

至于为什么 void 和 char 指针在您的系统上的大小为 2,我怀疑这是因为您在 16 位平台上。

于 2010-10-04T13:26:26.583 回答
1

指针存储指向其他东西的内存地址。指针的大小取决于您的平台。在 32 位平台上,您需要 32 位或 4 个字节来存储内存地址,因此任何指针的 sizeof 都将返回 4。

如果 sizeof(void*) 为 2,您可能在 16 位平台上运行。

于 2010-10-04T07:52:31.393 回答
0

正如 JaredPar 已经指出的那样,这取决于平台。换句话说:使用的 CPU 使用多少位进行内存寻址?对于 16 位地址,您将获得 2 个字节的大小。您是否正在为 16 位微控制器编译代码?

于 2010-10-04T07:45:40.053 回答
-2

Pointer 的大小等于 Integer 的大小。它在 16 位编译器中可以是 2 个字节,在 32 位编译器中可以是 4 个字节,在 64 位编译器中可以是 8 个字节。

void *ptr,int *ptr并且char *ptr会给你相同的大小,但如果你这样做ptr++,相应的指针将根据那里的数据类型跳转。即在voidchar案例中的 1 个位置。同样4个位置int以防万一。

于 2017-11-17T02:11:29.830 回答