现在下面的代码有什么问题?
int main(){
union {
char arr[10];
int var;
} u;
int *ptr_var= (int*) &(u.arr[1]);
*ptr_var = 42;
}
最佳答案
注意:已经给出了正确答案,这只是另一种解释背景的方式。
当访问内存中的对象时,大多数机器都要求对象对齐。这意味着一个四字节(32 位)的对象必须放置在可被四整除的地址上。这是因为 CPU 使用数据总线与内存相连,在我们的示例中,总线为 32 位。如果 CPU 要支持未对齐的访问,它就必须请求对内存的两次访问并将它们拼凑在一起。相反,大多数架构认为这是非法操作。
在您的例子中,您从一个 union 开始,它存储在一个偶数四字节的地址中。然后你向前移动一个字节并尝试在一个绝对不能是大小的偶数倍的地址访问 int
。
关于c - 令人头疼的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5387379/