pointers - 是否允许将任意值赋给指针并将它的递增?

  显示原文与译文双语对照的内容
77 3

这里代码的行为是否正确定义?

#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("%zun", val);
 return 0;
}

我的意思是,我们可以以给指针指定一些固定的数字,即使它指向一些随机地址。( 我知道你不能取消对它的引用)

时间:原作者:0个回答

78 0

作业:

void *ptr = (char *)0x01;

定义了实现behavior行为,因为它将整数转换为指针。这在 C 标准插件的第1 节详细说明:

5 一个整数可以转换为任何指针类型。除以前指定的,结果是定义的,可以能不正确对齐,可以能不指向引用类型的实体。

对于后面的指针算术:

ptr = (char *)ptr + 1;

这取决于一些事情。

首先,ptr的当前值可能是上中的陷阱表示。如果是,则行为为未定义的

接下来是 0x1 是否指向有效对象的问题。添加指针和整数只有指针操作数和结果点与 array 对象( 单个对象的大小为 1的array )的元素或者一个元素之一时才有效。这在第 6.5.6节详细说明:

注意对于这些操作符,7 指向非 array 元素的指针与指向长度为1的第一个元素的指针相同,该指针的类型为length元素类型的length

注意:在从指针中添加或者从中减去整数类型的表达式时,结果具有指针操作数的类型。如果指针操作数指向 array 对象的元素,而 array 足够大,则结果指向原始元素的偏移量,从而导致结果和原始 array 元素的下标等于整数表达式。此外,如果表达式指向 array 对象的最后一个元素,表达式为超过 array 对象的最后一个元素,表达式超过了对象的最后一个元素,表达式为 array 对象的最后一个元素,表示该对象的最后一个元素。如果指针操作数和result对象的结果指向同一个对象的元素,或者一个超出 array 对象的最后一个元素,则计算不会产生溢出;否则,该行为将被定义为不正确。if结果指向 array 对象的最后一个元素时,它不被用作一个一元 * 运算符的操作数。

在托管实现上,值 0x1 几乎肯定是 指向一个有效对象,在这种情况下,添加为未定义嵌入式实现可以以支持指向特定值的指针,如果 0x1 实际上是指向有效对象的情况。如果是,则行为为 defined defined,否则为 undefined 。

原作者:
91 5

否,这里程序的行为未定义。一旦在程序中达到了未定义的构造,任何将来的行为都是未定义的。,任何过去的行为都没有定义。

结果是void *ptr = (char*)0x01;是否定义了实现,因为 char 可以以具有一个陷阱表示形式。

但是,后面的指针算法在语句中的行为ptr = (char *)ptr + 1;因为指针运算只在数组的内部有效,这是因为指针算法只在数组的末尾。为此,对象是长度为1的array 。

原作者:
...