3

可能重复:
指针(地址)可以是负数吗?

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

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

PS我正在尝试初始化一个不是所有指针的结构,其中零对所有无效的类似值都有效,因此我可以选择在一个函数中进行部分初始化,然后将未初始化的字段初始化为默认值。如果在 c 中有一个模式/策略可以做到这一点?

4

4 回答 4

3

通常,唯一有效的指针值是 NULL,以及指向现有对象的开头、内部和之后的指针。另请注意,NULL 不一定必须表示为带有 0:s 的位模式。

在某些架构上,-1 是合法的指针值。一些微控制器在存储器的下部具有 RAM,而在上部具有只读存储器(如闪存)。

于 2011-03-21T11:47:48.227 回答
3

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

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

一个更好的主意,当NULL是一个有效值时,将所有指针设置为一个适当类型的哨兵。因此,如果您的结构有一个字段int *ip

static const int sentineli;

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

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

于 2011-03-21T11:39:07.863 回答
1

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

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

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

于 2011-03-21T11:40:31.467 回答
0

在任何现实世界的桌面或服务器系统上,将 -1 强制转换为指针等效于全位为一的指针表示,它不是有效的指针。假设指针加法以整数加法的形式进行,如果指针p具有全位 1 表示,p+1则将是全位零指针,在现实世界中是空指针。

尽管如此,标准并不能保证这一切。

于 2011-03-21T13:32:51.223 回答