- 论坛徽章:
- 2
|
回复 #111 zx_wing 的帖子
本来我觉得你知识面确实挺广的。 但怎么就这么固执呢?
是不是承认自己的错误对你来说很难?
17楼已经写出了标准的说法。 标准又说读写才是未定义行为吗?
再引用一下:
If both the pointer
operand and the result point to elements of the same array object, or one past the last
element of the array object, the evaluation shall not produce an overflow; otherwise, the
behavior is undefined.
仔细看看这句话, 包括chenzhanyiczy! 英语不好是怎么的?
有说读写才会产生未定义行为吗? 读写这个条件分明是你们自己加上去的。
这是理论的。 你实践多了就很牛逼? 理解就都是对的? 我也看你是经验丰富的老前辈, 才和你继续讨论的。
下结论前请说出自己的论据。 否则我也只能像对待chenzhanyiczy那样对待你了。
来个实践的:
《C 语言常见问题集》 by Steve Summit。
5.14 说真的, 真有机器用非零空指针吗, 或者不同类型用不同的表达?
至少PL/I, Prime 50 系列用段07777, 偏移0 作为空指针。后来的型号使用段
0, 偏移0 作为C 的空指针, 迫使类似TCNP (测试C 空指针) 的指令明显地成了现
成的作出错误猜想的蹩脚C 代码。旧些的按字寻址的Prime 机器同样因为要求字
节指针(char *) 比字指针(int *) 长而臭名昭著。
Data General 的Eclipse MV 系列支持三种结构的指针格式(字、字节和比特
指针), C 编译器使用了其中之二:char * 和void * 使用字节指针, 而其它的使用
字指针。
某些Honeywell-Bull 大型机使用比特模式06000 作为(内部的) 空指针。
CDC Cyber 180 系列使用包含环(ring), 段和位移的48 位指针。多数用户
(在环11 上) 使用的空指针为0xB00000000000。在旧的1 次补码的CDC 机器上
用全1 表示各种数据, 包括非法指针, 是十分常见的事情。
旧的HP 3000 系列对字节地址和字地址使用不同的寻址模式; 正如上面的机
器一样, 它因此也使用不同的形式表达char * 和void * 型指针及其它指针。
Symbolics Lisp 机器是一种标签结构, 它甚至没有传统的数字指针; 它使用
<NIL, 0> 对(通常是不存在的<对象, 偏移> 句柄) 作为C 空指针。
根据使用的“内存模式”, 8086 系列处理器(PC 兼容机) 可能使用16 位的数据
指针和32 位的函数指针, 或者相反。
一些64 位的Cray 机器在一个字的低48 位表示int *; char * 使用高16 位的
某些位表示一个字节在一个字中的偏移。
用segment + offset的机器不是不存在。 无法证明所有机器 offset 都一定不会回绕。 |
|