-1是有效的指针地址

时间:2011-03-21 11:36:44

标签: c initialization memset

  

可能重复:
  Can a pointer (address) ever be negative?

我正在考虑用memset将结构初始化为所有-1s(因为它使用了  没有带符号的数字,零是有效值)。

-1是一个有效的指针地址吗?我的想法还有其他问题吗? 注意:平台是linux / gcc / x86

P.S。我正在尝试初始化一个不是所有指针的结构,并且零对所有无效的类似值都有效,所以我可以选择在一个函数中进行部分初始化,然后将非初始化字段初始化为默认值。如果有一种模式/策略可以在c?

中执行此操作

4 个答案:

答案 0 :(得分:3)

-1作为指针的解释依赖于架构,因此不可靠。

通常,memset旨在设置字节,而不是指针。 C不保证各个字节如何组合来制作指针。即使您的解决方案有效,您也必须记录它的工作原理和原因。

NULL是有效值时,更好的想法是将所有指针设置为适当类型的标记。因此,如果您的结构包含字段int *ip

static const int sentineli;

// in the initialization:
foo->ip = (int *)&sentineli;

然后与该值进行比较。这是自我记录的。

答案 1 :(得分:3)

通常,唯一有效的指针值是NULL,指向现有对象的开头,内部和右边的指针。另请注意,NULL不一定必须表示为具有零的位模式:s。

在某些体系结构上,-1是合法的指针值。一些微控制器在内存的低部分具有RAM,在上部具有只读存储器(如闪存)。

答案 2 :(得分:1)

负数通常以实现定义的方式存储。一些实现使用1的补码来存储负数,其他实现使用2的补码。

  

我的想法还有其他问题吗?

代码可能无法跨实现移植。

答案 3 :(得分:0)

在任何现实世界的桌面或服务器系统上,-1转换为指针等同于all-bits-one指针表示,并且它不是有效指针。假设指针添加发生在整数加法中,如果指针p具有全比特一表示,p+1将成为全比特零指针,在现实世界中它是空指针。

尽管如此,标准并未保证这一点。