正在取消引用恒定的未定义行为

猎户座

以下代码段当然不是一个好主意:

char *vram = (char*)0xB8000;
memset(vram, 32, 0x18000);

这也不是:

volatile char *LCDC = (volatile char*)0xFF40;
char LCDCshadow = *LCDC;

并且以下显然是未定义的行为:

int *dontdoit = 0;
*dontdoit;

因为在指针上下文中使用0时,它将成为空指针的值,并且取消引用空指针是未定义的行为。

但是前两个示例是“未定义行为”,还是只是实现已定义/未指定
如果是后者,则如何生成一个值为0的有效指针?

dbush

转换为指针时,值为0的整数常量表达式将生成NULL指针,而与NULL指针的实际表示方式无关。

C标准的6.3.2.3p3节规定:

值为0的整数常量表达式或转换为type的表达式void *称为空指针常量。如果将空指针常量转换为指针类型,则保证生成的指针(称为空指针)将不相等的值与指向任何对象或函数的指针进行比较。

实现定义是将任何其他整数值转换为指针值从第6.3.2.3p5节开始:

整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。

以上内容通常适用于访问特定内存地址的嵌入式实现。

如果您有一个支持非零NULL指针的实现,则可以通过一个变量为它分配值0,例如:

int zero = 0;
int *zeroptr = (int *)zero;

在这种情况下,指针的值将为0,但不会为NULL。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否取消引用等于nullptr的指针的标准未定义行为?

来自分类Dev

取消引用无效的指针但不使用结果是否是C ++中的未定义行为?

来自分类Dev

未定义行为的定义

来自分类Dev

const的未定义行为

来自分类Dev

未定义行为fopen,fclose

来自分类Dev

声明中的“未定义行为”?

来自分类Dev

数组的“一个过去了”迭代器之后的未取消引用的迭代器是否未定义行为?

来自分类Dev

是否正在访问其绑定的未定义行为之外的全局数组?

来自分类Dev

正在通过const ref未定义行为捕获新构造的对象

来自分类Dev

具有Decltype和通用引用或未定义行为的VC ++错误?

来自分类Dev

与memcpy进行数据竞争,未定义行为?

来自分类Dev

这是const_cast的未定义行为吗?

来自分类Dev

UBSAN报告:-875 << 7为未定义行为

来自分类Dev

C ++异常,未定义行为和noexcept

来自分类Dev

将数组作为结构访问与未定义行为

来自分类Dev

以下链接分配是否导致未定义行为?

来自分类Dev

如何检查c中未定义行为?

来自分类Dev

2D数组索引-未定义行为?

来自分类Dev

C中潜在的未定义行为

来自分类Dev

C ++指针怪异的未定义行为

来自分类Dev

这是DWORD相关代码的未定义行为吗?

来自分类Dev

处理可能包含未定义行为的项目

来自分类Dev

RegisterWaitForSingleObject带有ManualResetEvent的未定义行为

来自分类Dev

减去指针时的C ++未定义行为

来自分类Dev

是int a = ++ i + ++ i未定义行为吗?

来自分类Dev

是否缺少必需的包含未定义行为?

来自分类Dev

使用比较器排序时的未定义行为

来自分类Dev

打印空指针未定义行为吗?

来自分类Dev

编译器的未定义行为

Related 相关文章

热门标签

归档