假设导致总线错误的代码块执行正常

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学生,简单的解释会有所帮助.

注意:已经提出了一个对这个问题看起来很熟悉的问题,但我只针对上面的代码块.

Ulr*_*rdt 9

我相信这本书是错的.代码导致未定义的行为.因此,期待任何某种行为是有缺陷的.另请注意,并非所有体系结构都会导致总线错误.如果这本书没有解释这个事实,那也不代表它.

  • @MartinJames-这很浪费。但是总是可以用废纸/厕纸来做的。 (2认同)
  • 也许,@ Dipstick.产生差异的关键是代码是否导致未定义的行为.如果代码导致UB并且本书暗示这可靠地导致总线错误,即使有隐含的CPU检测它们的假设,那么这本书肯定是错误的.我不排除交叉阅读和选择性引用使这看起来像书中的错误. (2认同)