GCC 4.0.2指向结构的双类型成员的取消引用指针引发SIGBUS错误

GCC 4.0.2指向结构的双类型成员的取消引用指针引发SIGBUS错误,c,gcc,struct,java-native-interface,sigbus,C,Gcc,Struct,Java Native Interface,Sigbus,下面的示例代码在我看来还行,但如果使用GCC4.0.2编译,则在Solaris上执行时总是会出现SIGBUS错误,但如果使用GCC3.4.2版本编译,则运行良好。有什么想法吗 //params is a pointer to a structure Param, which has a member d whose type is double. It was initiated/allocated through JNI. params->d = 5.0

下面的示例代码在我看来还行,但如果使用GCC4.0.2编译,则在Solaris上执行时总是会出现SIGBUS错误,但如果使用GCC3.4.2版本编译,则运行良好。有什么想法吗

        //params is a pointer to a structure Param, which has a member d whose type is double. It was initiated/allocated through JNI.

        params->d = 5.0;
        double *b = &params->d;
        double c = params->d;
        c += *b;
SIGBUS是在最后一行提出的,即取消引用指针和访问内容是导致问题的原因

谢谢,
查尔斯

对我来说,这听起来像是一个对齐问题。IIRC,
double
必须与64位对齐。

如何分配
params
?哪一行触发了SIGBUS?抱歉我漏掉了那个信息。参数是通过JNI分配的。它在最后一行失败并引发SIGBUS。在我看来,创建指向双成员的指针是可以的,但是取消引用它和访问内容失败了。您是否尝试过查看生成的代码和/或使用gdb单步执行代码?gdb显示b的类型为(double*),其引用值为5.0。SIGBUS通常意味着地址对齐错误(例如,对于
double
而言,它不是8的倍数)。请检查导致错误的地址以及如何访问该地址(查看反汇编)。可能gcc 4.0.2将此片段拼错。根据,“注意:GCC的4.1、4.2和4.3系列忽略了char类型的位字段的压缩属性。这在GCC 4.4中已修复,但更改可能导致结构布局的差异。有关更多信息,请参阅-Wpacked bitfield compat的文档。”。“根据GCC 4.0.2,char类型成员是否会导致未对齐?出于遗留原因,我的结构是使用packed属性定义的。