可能重复:
指针(地址)可以是负数吗?
我正在考虑使用 memset 将结构初始化为所有 -1(因为它不使用带符号的数字并且零是有效值)。
-1 是有效的指针地址吗?我的想法还有其他问题吗?注意:平台是 linux/gcc/x86
PS我正在尝试初始化一个不是所有指针的结构,其中零对所有无效的类似值都有效,因此我可以选择在一个函数中进行部分初始化,然后将未初始化的字段初始化为默认值。如果在 c 中有一个模式/策略可以做到这一点?
可能重复:
指针(地址)可以是负数吗?
我正在考虑使用 memset 将结构初始化为所有 -1(因为它不使用带符号的数字并且零是有效值)。
-1 是有效的指针地址吗?我的想法还有其他问题吗?注意:平台是 linux/gcc/x86
PS我正在尝试初始化一个不是所有指针的结构,其中零对所有无效的类似值都有效,因此我可以选择在一个函数中进行部分初始化,然后将未初始化的字段初始化为默认值。如果在 c 中有一个模式/策略可以做到这一点?
通常,唯一有效的指针值是 NULL,以及指向现有对象的开头、内部和之后的指针。另请注意,NULL 不一定必须表示为带有 0:s 的位模式。
在某些架构上,-1 是合法的指针值。一些微控制器在存储器的下部具有 RAM,而在上部具有只读存储器(如闪存)。
作为指针的解释-1
是依赖于架构的,因此是不可靠的。
通常,memset
旨在设置字节,而不是指针。C 不保证单个字节如何组合成一个指针。即使您的解决方案有效,您也必须记录它的工作方式和原因。
一个更好的主意,当NULL
是一个有效值时,将所有指针设置为一个适当类型的哨兵。因此,如果您的结构有一个字段int *ip
:
static const int sentineli;
// in the initialization:
foo->ip = (int *)&sentineli;
然后与该值进行比较。这是自我记录。
负数通常以实现定义的方式存储。一些实现使用 1 的补码来存储负数,其他实现使用 2 的补码。
我的想法还有其他问题吗?
代码可能无法跨实现移植。
在任何现实世界的桌面或服务器系统上,将 -1 强制转换为指针等效于全位为一的指针表示,它不是有效的指针。假设指针加法以整数加法的形式进行,如果指针p
具有全位 1 表示,p+1
则将是全位零指针,在现实世界中是空指针。
尽管如此,标准并不能保证这一切。