当前位置: 技术问答>linux和unix
我想问一个Sun OS平台上的C问题
来源: 互联网 发布时间:2015-01-24
本文导语: 相信只要进行过sparc芯片上开发的人都可能碰到过这个问题 我有一个程序都是用标准C写的,在linux 7.3和x86平台下运行的很好gcc是2.91 在Ultra 2 的Sun OS 上也编译通过,gcc是3.0 惟独在Sun上执行的时候就出现一个异常,...
相信只要进行过sparc芯片上开发的人都可能碰到过这个问题
我有一个程序都是用标准C写的,在linux 7.3和x86平台下运行的很好gcc是2.91
在Ultra 2 的Sun OS 上也编译通过,gcc是3.0
惟独在Sun上执行的时候就出现一个异常,用gdb观察居然发现是一个unsigned int
赋值的时候出了问题?
已知struct A *p=calloc(1,1000);
struct A
{ unsigned int b;
}
那么(p+1)->b=(unsigned int )100;就会异常?为什么呢?
我有一个程序都是用标准C写的,在linux 7.3和x86平台下运行的很好gcc是2.91
在Ultra 2 的Sun OS 上也编译通过,gcc是3.0
惟独在Sun上执行的时候就出现一个异常,用gdb观察居然发现是一个unsigned int
赋值的时候出了问题?
已知struct A *p=calloc(1,1000);
struct A
{ unsigned int b;
}
那么(p+1)->b=(unsigned int )100;就会异常?为什么呢?
|
这和sparc芯片有关,不允许存取非对齐方式的整数值
C问题不分操作系统
C问题不分操作系统
|
我基本可以确认程序无问题,但是编译时要选择字节对齐而不是字对齐(缺省情况)。另外请注意你的CC的版本。我是5年前碰到类似的问题的,当时小cc3.0.1(C编译器)不能解决,开关无效,我是用CC4.1解决的。至于gcc我没有试过,不知道。我现在手边没有sun,你如果认识华为网管的朋友可以问问他们。不过如果你英文可以man或CC多或少-h or -?也可以找到的.
|
SPARC强制地址对齐而x86则不强制,一般RISC都要求地址对齐。
在不对齐的情况下SPARC触发异常,x86则用两个周期分别读取然后在合并,所以效率很低。请参考http://www.sparc.com,有SPARC的规范。看明白了就知道原来x86(从8086直到P4)都是狗屎。
在不对齐的情况下SPARC触发异常,x86则用两个周期分别读取然后在合并,所以效率很低。请参考http://www.sparc.com,有SPARC的规范。看明白了就知道原来x86(从8086直到P4)都是狗屎。