这段代码的行为定义是否明确?
#include <stdio.h>
#include <stdint.h>
int main(void)
{
void *ptr = (char *)0x01;
size_t val;
ptr = (char *)ptr + 1;
val = (size_t)(uintptr_t)ptr;
printf("%zu\n", val);
return 0;
}
我的意思是,我们可以为指针分配一些固定数字并递增它,即使它指向某个随机地址? (我知道你不能取消引用它)
分配:
void *ptr = (char *)0x01;
Is 实现定义的行为因为它正在将整数转换为指针。这在第 6.3.2.3 节中有详细介绍。C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf关于指针:
5整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的,
可能未正确对齐,可能未指向实体
引用类型的,并且可能是陷阱表示。
至于后续的指针运算:
ptr = (char *)ptr + 1;
这取决于一些事情。
首先,当前值ptr
may是按照上面 6.3.2.3 的陷阱表示。如果是,则行为是不明确的.
接下来的问题是是否0x1
指向一个有效的对象。仅当指针操作数和结果都指向数组对象的元素(单个对象算作大小为 1 的数组)或数组对象后面的一个元素时,指针和整数相加才有效。第 6.5.6 节对此进行了详细说明:
7就这些运算符的目的而言,指向不是数组元素的对象的指针的行为与
指向长度为 one 且类型为的数组的第一个元素的指针
对象的元素类型
8当整数类型的表达式与指针相加或相减时,结果具有指针的类型
操作数。如果指针操作数指向数组的元素
对象,并且数组足够大,结果指向一个元素
与原始元素的偏移量,使得
结果数组元素和原始数组元素的下标等于
整数表达式。换句话说,如果表达式P指向
数组对象的第 i 个元素,表达式(P)+N(相当于,N+(P) ) and (P)-N (where N具有 n ) 指向的值,
分别是数组对象的第 i+n 个和第 i−n 个元素(前提是它们存在)。此外,如果表达式 P 指向 an 的最后一个元素
数组对象,表达式(P)+1点超过最后一个元素
数组对象,如果表达式Q点过去了
数组对象的最后一个元素,表达式(Q)-1指着
数组对象的最后一个元素。如果两个指针
操作数和结果指向同一个数组的元素
对象,或者数组对象的最后一个元素之后,
评估不应产生溢出;否则,行为是
不明确的。如果结果指向最后一个元素
数组对象,不得用作一元的操作数
* 被评估的运算符。
在托管实施上的价值0x1
几乎肯定会not指向一个有效的对象,在这种情况下添加是不明确的。然而,嵌入式实现可以支持将指针设置为特定值,如果是这样,情况可能是这样的0x1
事实上确实指向一个有效的对象。如果是这样,则行为是明确的,否则就是不明确的.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)