【发布时间】:2020-09-09 17:35:02
【问题描述】:
我知道指针转换的结果与对齐冲突一旦取消引用就会调用未定义的行为。
但是仅用于地址计算的指针转换(不取消引用)呢?
void *addr_calc(single_byte_aligned_struct_t *ptr, uint32_t dword_offset)
{
uint32_t *dw_ptr = (uint32_t *)ptr;
return dw_ptr + dword_offset;
}
假设ptr 的值为X。是否保证addr_calc() 会返回X + sizeof(uint32_t) * dword_offset?
我的假设是,但最近我在 C11 标准中看到以下内容,J.2 未定义行为部分
— 两种指针类型之间的转换会产生错误对齐的结果 (6.3.2.3)。
如果我理解正确的话,转换本身会调用未定义的行为,而不仅仅是取消引用,这意味着在这种情况下,即使是指针算术也可能表现得无法预测。我说的对吗?
【问题讨论】:
-
这里的主要问题,当前的任何答案都没有解决,是 + 运算符没有明确定义的行为,以防指针操作数不指向同一个数组 (其中普通变量被视为大小为 1) 的数组。见Is it undefined behaviour to just make a pointer point outside boundaries of an array without dereferencing it?,同样的问题。
-
@Lundin 我不确定是不是一回事。我的问题更多的是关于“uint32_t dw_ptr = (uint32_t *)ptr;”这一行。假设‘+ dw_offset’不会导致超出数组范围的结果。
标签: c undefined-behavior memory-alignment c11 pointer-arithmetic