【发布时间】:2011-07-31 18:28:02
【问题描述】:
我在 linux(x86,32-bit) 上写了一个程序,一切正常。但是当我尝试在 Solaris (SPARC,64-bit) 上编译和运行相同的源代码时,我得到了一个总线错误 (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
原来是fscanf函数导致的bug,对应的代码片段如下:
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 试图防止这两台机器之间的对齐差异。
【问题讨论】:
-
向我们展示你的结构的定义 (
record)。
标签: c linux solaris memory-alignment