Ale*_*op. 3 c memory-alignment pointer-arithmetic undefined-behavior c11
我知道,一旦取消引用,带有对齐冲突的指针转换的结果就会调用未定义的行为。
\n但是仅用于地址计算(不取消引用)的指针转换怎么样?
\nvoid *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}\nRun Code Online (Sandbox Code Playgroud)\n我们假设 的ptr值为X。能保证一定addr_calc()会回来X + sizeof(uint32_t) * dword_offset吗?
我的假设是,但最近我在 C11 标准的J.2 节中看到了以下未定义行为
\n\n\n\xe2\x80\x94 两个指针类型之间的转换会产生不正确对齐的结果 (6.3.2.3)。
\n
如果我理解正确的话,转换本身会调用未定义的行为,而不仅仅是取消引用,这意味着在这种情况下,即使是指针算术也可能表现出不可预测的行为。我对吗?
\nptr如果没有正确对齐,这实际上可能会导致未定义的行为uint32_t。有些系统可能允许,但其他系统可能会触发故障。
安全的转换是 to char *,然后对其进行指针算术。
return (char *)ptr + dword_offset * sizeof(uint32_t);
Run Code Online (Sandbox Code Playgroud)