我在 linux(x86,32 位)上编写了一个程序,一切正常。但是当我尝试在 Solaris(SPARC,64 位)上编译和运行相同的源代码时,出现总线错误(SIGBUS)。来自 gdb 的消息如下:
gdb) where
#0 0xff2aa57c in number () from /lib/libc.so.1
#1 0xff2a9a70 in __doscan_u () from /lib/libc.so.1
#2 0xff2b0014 in vsscanf () from /lib/libc.so.1
#3 0xff2aeb90 in fscanf () from /lib/libc.so.1
#4 0x00010940 in main (argc=4, argv=0xffbff48c) at wHeap.c:22
原来这个bug是因为fscanf函数,对应的代码片段如下:
while( fscanf(input,"%[^,],%hu,%u,%u,%[^\n]\n",record.name,&record.race,&record.class,&record.id,record.guild) != EOF){
......
}
基本上,我尝试从逗号分隔值文件中提取信息并将它们存储在结构(记录)数组中,例如:
Rod'rod,1,4,103026,Project Peace
Ceru,1,6,89351,World Keepers
Belget,2,9,246708,Radiant Heaters
记录结构如下:
#pragma pack(1)
typedef struct {
char name[MAXNAME];
unsigned short race;
unsigned int class;
unsigned int id;
char guild[MAXGUILD];
}record;
正如您可能注意到的,我使用了 pragma pack 来尝试防止这两台机器之间的对齐差异。