【发布时间】:2014-12-12 18:16:23
【问题描述】:
C++ 标准(以及与此相关的 C)允许创建(虽然不是取消引用)指向数组末尾后一个元素的指针。这是否意味着数组永远不会被分配到其最后一个元素在内存边界处结束的位置?我了解在实践中部分/所有实现可能遵循此约定,但以下哪一项是正确的:
- 实际上是错误的,数组可能在内存边界处结束,或者
- C++ 标准要求在边界之前至少结束一个元素的内存价值,或者
- 不是 1 也不是 2,但在实际编译器中仍然是这样,因为它使实现更容易。
C 的情况有什么不同吗?
更新:
似乎 1 是正确答案。请参阅下面 James Kanze 的回答,另请参阅 efence(http://linux.die.net/man/3/efence - 感谢 Michael Chastain 提供指向它的指针)
【问题讨论】:
-
我不认为标准,当然对于 C++ 要求任何关于内存分配的内容,所以 1 和 2 不会是真的,可能 3 更可能是实现细节
-
我应该澄清我的第一条评论,因为 1 它可能在内存边界处结束,但这不是标准中指定的内容,而是由实施者决定
-
@JamesKanze :我的意思是 0x40000000 可以存储到 32 位指针变量中,而 0x100000000 不能。因此,可以很容易地使指针超过数组末尾的位置,除非该指针会溢出指针类型。只有当可寻址范围满足或超过指针类型的范围时,才会发生这种情况。我想不出一个这样的平台。显然,陷阱条件可能存在(就像您在回答中指出的那样),但可以解决这些问题。
-
@SanderDeDycker 它总是可以工作的;只是不要使用分配块的最后一个字节/字。至于可寻址范围超出指针类型范围的机器:如果您的指针不包括段寄存器,则有 Intel。
-
@abi:我更喜欢将指针视为指向内存位置“之间”的空格,并说“
*foo”表示“紧跟在foo点之后的东西”。一把 12 英寸的尺子在 0 英寸、1 英寸、2 英寸、直到 12 英寸处有 13 个标记,标记之间有 12 个空格;每 12 英寸都有一个标记在开头和结尾。在这样的情况下从观点来看,12" 标记只是一个标记,就像其他标记一样,即使它后面没有任何东西。