空指针的大小

Posted

技术标签:

【中文标题】空指针的大小【英文标题】:sizeof void pointer 【发布时间】:2011-04-20 16:18:19 【问题描述】:

为什么sizeof是空指针2

【问题讨论】:

因为这是系统中指针的大小。大小以char 的大小表示。 char 通常为 8 位长,但并非必须如此。 不是。或者更具体地说:不一定是这样。 你是对的。其平台相关 (off topic) 我建议你切换到 Windows 10,因为 DOS 可能不是最好的编码平台 :-) 【参考方案1】:

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

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

【讨论】:

他可能在 16 位 DOS 下运行 Turbo C @Paul,感谢更新了 16 位操作系统。我认为这更有可能是一个错误,而不是人们仍在使用 16 位操作系统,但这可能是一个糟糕的假设。 出于某种原因,许多大学(尤其是印度的大学)似乎仍在使用 Turbo C 和 16 位 DOS(以及一些非常糟糕的教科书)之类的东西,这就是为什么我们倾向于看到很多关于 SO 和其他地方的问题,例如void main() 以及关于 sizeof(void *) 为 2 等的假设。【参考方案2】:

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

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

【讨论】:

void 指针的大小和 int 的大小不是一回事。在我的 OSX 机器上使用 gcc,sizeof(int) == 4sizeof(void *) == 8【参考方案3】:

根据online C standard (n1256 draft):

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

小错误,我想你的意思是这样写:“如果 sizeof(void*) 是 2,你是专业的..”;) @Ix:谢谢,已修复。感谢您了解这一点。 sizeof 返回相对于char 大小的大小。 char 类型通常为 8 位长,但并非必须如此。我不是说我知道这样的系统,但拥有一个系统并非不可能,其中char 是 32 位长,在这样的系统中 sizeof(char)sizeof(int)sizeof(void*) 都可以等于 1 .【参考方案5】:

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

【讨论】:

是的,“微控制器”Intel 8088,用于 IBM PC。 :-)

以上是关于空指针的大小的主要内容,如果未能解决你的问题,请参考以下文章

没有初始大小的字符串数组给出空指针异常

C语言空指针NULL以及void指针

记一次getResourceAsStream空指针报错问题

标度适应性测试的空指针异常

自己写一个swap函数交换任意两个相同元素值 对空指针的使用 字节大小的判断

3499 个元素后的 Java 数组空指针