【问题标题】:Is -1 a valid pointer address [duplicate]-1 是一个有效的指针地址吗[重复]
【发布时间】:2011-03-21 11:36:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • @Naveen:不是重复的,因为 OP 使用 memset

标签: c initialization memset


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    NULL 是一个有效值时,一个更好的想法是将所有指针设置为适当类型的哨兵。所以,如果你的结构有一个字段int *ip:

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

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

    【讨论】:

    • 它们的字段不都是指针
    • @Roman:用memset 初始化一个指针仍然是一个非常糟糕的主意。
    【解决方案3】:

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

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

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

    【讨论】:

    • -1 与memset 一起使用将始终是全一位模式,因为-1 被转换为unsigned char。当然这不一定匹配整数值-1,C中也不存在指针值-1这样的东西。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 2020-12-30
      • 2013-12-04
      • 1970-01-01
      • 2016-06-04
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多