我寫的東西像Java,和我有指針的問題( - - ) 我有一個結構:C++不可能的指針行爲
struct _lnHeader32
{ unsigned char signature[2]; //LN
unsigned char architecture;
unsigned int length; //Without _lnHeader
unsigned int lnHeaderLength;
unsigned char permissions;
unsigned char typeOfExecutable;
unsigned int flowSegment;
unsigned int dataSegment;
unsigned int loaderSegment;
unsigned int cleanerSegment;
unsigned int errorSegment;
unsigned int exportTable;
unsigned int importTable;
unsigned int authenticationTable; //Encrypt it with GPG.
unsigned int loaderTable;
};
我打開可執行文件,它是在小尾數,由使用std :: fstream的:
lnFile.open(argv[1], std::fstream::in | std::fstream::binary);
if (false == lnFile.is_open())
throw (unableToOpen);
lnSize = getFileSize(lnFile);
lnImage = new (std::nothrow) unsigned char [lnSize];
if (0 == lnImage)
throw (noMem);
lnFile.read(reinterpret_cast<char*>(lnImage), lnSize); //#1 Possible mistake?
if (!lnFile)
throw (unableToRead);
lnFile.close();
然後我點_lnHeader32 *來分配lnImage:
lnHeader32 = reinterpret_cast<_lnHeader32*>(lnImage);
在最後我通過兩種方法打印整個結構:
//Method 1
std::cout << reinterpret_cast<unsigned int*>(lnImage) << "\n";
std::cout << reinterpret_cast<unsigned int*>(lnImage+2) << "\n";
std::cout << reinterpret_cast<unsigned int*>(lnImage+3) << "\n";
std::cout << reinterpret_cast<unsigned int*>(lnImage+7) << "\n";
std::cout << reinterpret_cast<unsigned int*>(lnImage+11) << "\n";
std::cout << reinterpret_cast<unsigned int*>(lnImage+12) << "\n\n";
//Method 2
std::cout << reinterpret_cast<unsigned int*>(&lnHeader32->signature) << "\n";
std::cout << reinterpret_cast<unsigned int*>(&lnHeader32->architecture) << "\n";
std::cout << reinterpret_cast<unsigned int*>(&lnHeader32->length) << "\n";
std::cout << reinterpret_cast<unsigned int*>(&lnHeader32->lnHeaderLength) << "\n";
std::cout << reinterpret_cast<unsigned int*>(&lnHeader32->permissions) << "\n";
std::cout << reinterpret_cast<unsigned int*>(&lnHeader32->typeOfExecutable)
<< "\n\n";
它給了我像輸出:
0xe8b260
0xe8b262
0xe8b263 <---
0xe8b267
0xe8b26b
0xe8b26c
0xe8b260
0xe8b262
0xe8b264 <--- Should be 0xe8b263 | Here starts problem
0xe8b268
0xe8b26c
0xe8b26d
它通過使用第一種方法打印以及lnHeader32的領域,但我更喜歡使用第二種方法。我計算了一切幾次。爲什麼會發生? 可執行文件是由perl編譯器生成的,對它有什麼影響?
https://en.wikipedia.org/wiki/Data_padding –
使用nothrow new,只檢查結果爲null,然後拋出是一個真正的WTF? –
現在一切都很好。謝謝你,Oli Charlesworth。 – SysOp