私のバグは数時間後に見つけられ、次のプログラムで隔離されました。問題は、構造体へのポインタを使用するときにpst2変数の値が計算される方法にあります。 charへのポインターを使用すると、すべて正常に動作します。どうしてこれなの?
(GCC/G ++バージョンの使用:(Debianの4.4.5-8)4.4.5)(不思議に思っている人のために。私は、通常のオフセットでデータ・グループを含むファイル・バッファにアクセスしています)
C++のポインタの算術奇妙さ
#include <iostream>
#include "testpa.h"
#pragma pack(push)
#pragma pack(1)
//---------------------------
struct st_one
{
int i;
char c;
};
//---------------------------
struct st_two
{
long l;
int i;
};
#pragma pack(pop)
//===========================
int main()
{
int n=1024, np1=sizeof(st_one); //, np2=sizeof(st_two);
st_one *pst1, *pst1a;
st_two *pst2, *pst2a;
char *pc1, *pc2, *pc1a, *pc2a, *pb;
pb = new char[n];
pst1 = (st_one*)(pb);
pst2 = (st_two*)(pst1 + np1); //using pst1
pc1 = (char*)(pb);
pc2 = (char*)(pc1 + np1); //using pc1
pst1a = (st_one*)(pb);
pst2a = (st_two*)(pb + np1); //using pb
pc1a = (char*)(pb);
pc2a = (char*)(pb + np1); //using pb
std::cout << "\npb = " << (long)pb;
std::cout << "\n-----";
std::cout << "\npst1 = " << (long)pst1 << "\tpst2 = " << (long)pst2;
std::cout << "\npc1 = " << (long)pc1 << "\tpc2 = " << (long)pc2;
std::cout << "\n-----";
std::cout << "\npst1a = " << (long)pst1a << "\tpst2a = " << (long)pst2a;
std::cout << "\npc1a = " << (long)pc1a << "\tpc2a = " << (long)pc2a;
std::cout << "\n-----\n";
return 0;
}
を
出力:
pb = 19546128
pst1 = 19546128 pst2 = 19546153 <--- WRONG!
pc1 = 19546128 pc2 = 19546133
pst1a = 19546128 pst2a = 19546133
pc1a = 19546128 pc2a = 19546133
どのように間違っているかはわかりません。あなたはどんな行動を期待していますか? –
これは難しいことです。 'pst1 [offset] .c'で何が問題になっていますか?コンパイラが作業をするようにしてください。とにかくポインタの算術演算を行う予定であり、エラーが発生する可能性は低いです。 – msw