在使用对齐冲突进行强制转换后,指针算术是否仍然定义良好?

Ale*_*op. 3 c memory-alignment pointer-arithmetic undefined-behavior c11

我知道,一旦取消引用,带有对齐冲突的指针转换的结果就会调用未定义的行为。

\n

但是仅用于地址计算(不取消引用)的指针转换怎么样?

\n
void *addr_calc(single_byte_aligned_struct_t *ptr, uint32_t dword_offset)\n{\n    uint32_t *dw_ptr = (uint32_t *)ptr;\n\n    return dw_ptr + dword_offset;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我们假设 的ptr值为X。能保证一定addr_calc()会回来X + sizeof(uint32_t) * dword_offset吗?

\n

我的假设是,但最近我在 C11 标准的J.2 节中看到了以下未定义行为

\n
\n

\xe2\x80\x94 两个指针类型之间的转换会产生不正确对齐的结果 (6.3.2.3)。

\n
\n

如果我理解正确的话,转换本身会调用未定义的行为,而不仅仅是取消引用,这意味着在这种情况下,即使是指针算术也可能表现出不可预测的行为。我对吗?

\n

dbu*_*ush 5

ptr如果没有正确对齐,这实际上可能会导致未定义的行为uint32_t。有些系统可能允许,但其他系统可能会触发故障。

安全的转换是 to char *,然后对其进行指针算术。

return (char *)ptr + dword_offset * sizeof(uint32_t);
Run Code Online (Sandbox Code Playgroud)