버그가 발견되어 (몇 시간 후) 다음 프로그램에서 분리되었습니다. 문제는 struct에 대한 포인터를 사용할 때 pst2 변수의 값이 계산되는 방식입니다. char에 대한 포인터를 사용하면 모든 것이 잘 동작합니다. 왜 이런거야?
(궁금해하는 사람들을 위해. : 나는 일반 오프셋에서 데이터 그룹을 포함하는 파일 버퍼를 액세스하는거야)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;
}
: ((데비안 4.4.5-8) 4.4.5 ++ 버전의 gcc/g를 사용)
출력 : 나에게 잘 보이는
pb = 19546128
pst1 = 19546128 pst2 = 19546153 <--- WRONG!
pc1 = 19546128 pc2 = 19546133
pst1a = 19546128 pst2a = 19546133
pc1a = 19546128 pc2a = 19546133
내가 그 잘못 표시되지 않습니다. 어떤 행동을 기대합니까? –
그건 어려운 방법입니다. 'pst1 [offset] .c'의 문제점은 무엇입니까? 컴파일러가 작업을 수행하게하십시오. 어쨌든 포인터 연산을 수행 할 것이므로 오류가 발생하기 쉽습니다. – msw