0

次のコードを検討してください。

#include "stdio.h"

typedef struct CustomStruct
{
  short Element1[10];
}CustomStruct;

void F2(char* Y)
{
  *Y=0x00;
  Y++; 
  *Y=0x1F;    
}

void F1(CustomStruct* X)
{
  F2((char *)X);
  printf("s = %x\n", (*X).Element1[0]);
}

int main(void)
{
  CustomStruct s;
  F1(&s);

  return 0;
}

実行時、関数の呼び出しが終了するまでに、F1さまざまなコンパイラを使用することでさまざまな結果が得られます。

(*X).Element1[0] = 0x1f00一部のコンパイラと(*X).Element1[0] = 0x001f別のコンパイラで。

それがエンディアンの問題であることは明らかです。

使用するコンパイラに関係なく取得できるように、使用するコンパイラ オプションまたは回避策はあります(*X).Element1[0] = 0x001fか?

4

2 に答える 2

2

F2()が を受け取っている場合char *、エンディアン関連の問題を引き起こすには、かなり奇妙なことをしているに違いありません。

これらは、一度に複数にアクセスする場合にのみ発生しcharます。ただし、破損している間にそのようなアクセスを手動で行っている場合を除きます。それは引数を何かにキャストしていshort *ますか?

要するに、より多くのコードを表示します。

于 2013-07-03T13:01:21.583 に答える