c - 令人头疼的段错误

标签 c segmentation-fault

现在下面的代码有什么问题?

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/

相关文章:

c - 为什么两个 .C 文件中的同名私有(private)函数会导致多重定义错误?

c - 为什么第一个 printf 不起作用,而其他两个使用相同的结构?

更改 OpenGL 上下文的大小

c - 我的 C 应用程序中出现段错误

c - 段错误 : while simulating tournament branch predictor

c - 避免 C 头文件中的循环依赖

c - 解析问题预期语句C程序

go - 尝试复制时boltdb出现意外故障地址

c - 多维数组段错误和 139 (0x8B) 返回

c++ - setter 导致段错误