在solaris和linux下对一个struct diffrent的恐惧

eac*_*tor 1 c linux solaris fread

我正在使用fread读取文件的第一个字节:

fread(&example_struct, sizeof(example_struct), 1, fp_input);
Run Code Online (Sandbox Code Playgroud)

哪个在linux和solaris下结果不同?那么example_struct(Elf32_Ehdr)是elf.h中定义的Standart GNU C Liborary的一部分?我很高兴知道为什么会这样?

一般结构看起来如下:

typedef struct
{
  unsigned char e_ident[LENGTH];    
  TYPE_Half e_type;         
} example_struct;
Run Code Online (Sandbox Code Playgroud)

调试代码:

for(i=0;paul<sizeof(example_struct);i++){
    printf("example_struct->e_ident[%i]:(%x) \n",i,example_struct.e_ident[i]);
}
printf("example_struct->e_type: (%x) \n",example_struct.e_type);
printf("example_struct->e_machine: (%x) \n",example_struct.e_machine);
Run Code Online (Sandbox Code Playgroud)

Solaris输出:

Elf32_Ehead->e_ident[0]: (7f) 
Elf32_Ehead->e_ident[1]: (45) 
...
Elf32_Ehead->e_ident[16]: (2) 
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (200) 
Elf32_Ehead->e_machine: (6900) 
Run Code Online (Sandbox Code Playgroud)

Linux输出:

Elf32_Ehead->e_ident[0]: (7f) 
Elf32_Ehead->e_ident[1]: (45) 
...
Elf32_Ehead->e_ident[16]: (2) 
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (2) 
Elf32_Ehead->e_machine: (69)
Run Code Online (Sandbox Code Playgroud)

也许类似于:http://forums.devarticles.com/cc-help-52/file-io-linux-and-solaris-108308.html

Joa*_*ård 5

你没有提到机器中的CPU,可能是Solaris机器中的Sparc64和Linux机器中的x86_64,但我猜你有一个字节序问题.英特尔,ARM和当今大多数其他常见架构都称为little-endian,Sparc架构是big-endian.

假设我们0x1234在CPU寄存器中有值,我们想将它存储在内存中(或者在硬盘驱动器上,无论在哪里).我们N是我们要写入到内存地址.我们需要将这个16位整数作为两个字节存储在内存中,这里有一个令人困惑的部分:

使用大端机器将存储0x12在地址N0x34地址N+1.一个小端机器将存储0x34在地址N0x12地址N+1.如果我们使用一个小端机器存储一个值并使用大端机器读回来,我们将交换两个字节,你会得到你所看到的问题.