【发布时间】:2015-05-20 12:48:22
【问题描述】:
这是围绕Example of error caused by UB of incrementing a NULL pointer的讨论的相关问题
假设我定义了这个数据结构:
union UPtrMem
{
void* p;
char ach[sizeof(void*)];
}
UPtrMem u;
u.p = nullptr;
u.p++; // UB according to standards
u.ach[0]++; // why is this OK then??
p 和ach 共享相同的内存,那么仅仅是修改内存位置(恰好包含指针)UB 的行为吗?我认为只有在您尝试取消引用指针时它才会变得未定义。
【问题讨论】:
-
我不明白这个问题与您链接的问题有何不同(以及与该问题相关的问题)。当一个程序包含 UB 时,它包含 UB。如该问题中所述,您的程序故意在
u.p++包含UB。还有什么好说的? -
AFAIK,使用
char数组对指针进行别名处理并使用char数组执行某些操作不能保证在您再次将内存解释为指针时产生任何合理的效果。 -
你基本上把this question和this question放在同一个问题上。我很想把这个问题作为至少一个重复的问题来结束。有什么理由不应该?
-
@Jefffery:我认为 OP 隐含了他问题的关键部分:我怀疑他实际上是想问“
u.ach[0]++与u.p++做同样的事情,那么为什么是一个 UB 和另一个没有?”。 -
−1 不是真正的代码,而且显然是为诱捕响应者而设计的。