0.s*_*.sh 3 c segmentation-fault bus-error
我目前正在阅读Expert C Programmign - Deep C Secrets.在作者解释总线错误和分段错误的第164页上,他展示了这行代码
union {
char a[10];
int i;
} u ;
int * p = ( int * ) &(u.a[1]);
*p = 17; /* the misaligned addr in p causes a bus error */
Run Code Online (Sandbox Code Playgroud)
上面的代码假设触发了一个总线错误,但是当我运行它时,它运行正常没有任何错误.作者给出了以下解释
这会导致总线错误,因为数组/ int联合确保字符数组"a"也处于整数的合理对齐地址,因此"a + 1"绝对不是.然后,我们尝试将4个字节存储到仅为单字节访问对齐的地址中.一个好的编译器会警告错位,但它不能发现所有事件.
我对上述陈述的理解是,char1个字节,我们试图int在索引上放置一个4字节,char a[10]因此会发生总线错误(我不确定我的理解是对还是错)
我的问题是为什么上面的代码不会导致总线错误.
注意:我不是CS学生,简单的解释会有所帮助.
注意:已经提出了一个对这个问题看起来很熟悉的问题,但我只针对上面的代码块.
我相信这本书是错的.代码导致未定义的行为.因此,期待任何某种行为是有缺陷的.另请注意,并非所有体系结构都会导致总线错误.如果这本书没有解释这个事实,那也不代表它.