|
|
1
52
要添加标准报价:
(5.1)不适用,因为指针不是空指针。(5.2)不适用,因为指针不在同一数组中。所以,我们只剩下(5.3)-ub了。 |
|
|
2
28
这是未定义的行为。只有当两个指针指向同一数组中的元素时,才能很好地定义它们之间的减法。( [expr.add] ¶5.3 )
即使有一些假设的方法以合法的方式获得这个值,即使求和也是非法的,因为即使指针+整数求和也被限制在数组的边界内。( [expr.add] ¶4.2 )
|
|
|
3
9
第三行是未定义的行为,因此标准允许在此之后进行任何操作。 只允许减去指向同一数组(或同一数组之后)的两个指针。
Windows或Linux并不真正相关;编译器尤其是它们的优化器会破坏程序。例如,优化器可能认识到
|
|
|
4
7
该标准允许在将内存划分为离散区域的平台上实现,这些区域不能通过指针算法相互访问。作为一个简单的例子,一些平台使用24位地址,这些地址由一个8位的银行编号和一个银行内的16位地址组成。将一个地址添加到标识一个银行的最后一个字节的地址中,将产生指向该地址第一个字节的指针。
相同的
银行,而不是
下一个
银行。这种方法允许使用16位数学而不是24位数学计算地址算术和偏移量,但要求没有对象跨越一个银行边界。这样的设计会给
许多平台没有这样的体系结构限制,一些专为此类平台上的低级编程而设计的编译器将允许在任意指针之间执行地址算法。该标准指出,处理未定义行为的一种常见方法是“在翻译或程序执行过程中以文档化的方式以环境的特征进行行为”,并且在支持通用指针算法的环境中支持它将很好地适应该类别。不幸的是,该标准未能提供任何方法来区分以这种有用方式运行的实现和不以这种方式运行的实现。 |
|
Paul J. Lucas · _C中任意大小的原子结构体赋值? 1 年前 |
|
|
nore · 为什么C标准禁止在源文件末尾使用部分预处理令牌? 1 年前 |
|
Gene · 是否允许使用受约束的别名模板? 1 年前 |
|
|
yg-i · C的“基本执行字符集”中的字符总数究竟是多少? 1 年前 |