为什么指针在初始化后保持空点

Why pointer remains nullptr after initialisation

本文关键字:指针 初始化 为什么      更新时间:2023-10-16

我编写了二进制解析器,它可以读取和打印有关文件的各种信息。出于速度原因,我希望直接使用 E32ImageHeader 数据而不是函数调用。

我传递 nullptr 初始化的变量,并且在函数返回变量之后保持 nullptr。在 GetFileLayout(( 中,gdb 打印了 iHdr 的各种字段值,还有一些正确的其他需要修改。

代码看起来正确,但工具打印"无法识别标头!!",用于测试的二进制文件 kf__speedups_SDK.pyd 在此处

主.cpp:

#include <iostream>
#include "e32info.h"
#include "e32parser.h"
using namespace std;
int main()
{
E32ImageHeader *hdr = nullptr;
E32Parser *parser = new E32Parser("AlternateReaderRecogE32.dll", hdr);
parser->GetFileLayout(hdr);
if(!hdr)
cout << "Header not recognized!!!n";
//    E32Info *f = new E32Info("h", "AlternateReaderRecogE32.dll");
//    f->Run();
cout << "Hello world!" << endl;
delete parser;
return 0;
}

二进制解析器头文件 e32parser.h:

#ifndef E32PRODUCER_H
#define E32PRODUCER_H
class E32ImageHeader;
class E32Parser
{
public:
E32Parser(const char* aFilename, E32ImageHeader *aHdr);
~E32Parser();
void GetFileLayout(E32ImageHeader *result);
private:
void ReadFile();
private:
E32ImageHeader *iHdr = nullptr;
const char *iFileName = nullptr;
char *iBufferedFile = nullptr;
size_t iE32Lenth = 0;
}

工作原理 e32解析器.cpp:

#include <fstream>
#include <cstring>
#include <cstdlib>
#include "e32common.h"
#include "e32parser.h"
E32Parser::E32Parser(const char* aFilename, E32ImageHeader *aHdr):
iHdr(aHdr), iFileName(aFilename)
{
}
E32Parser::~E32Parser()
{
delete iBufferedFile;
}

将二进制文件读取到内部缓冲区

void E32Parser::ReadFile()
{
std::fstream fs(iFileName, fs.binary | fs.in);
if(!fs)
throw;
fs.seekg(0, fs.end);
int lenth = fs.tellg();
fs.seekg(0, fs.beg);
iBufferedFile = new char[lenth];
fs.read(iBufferedFile, lenth);
fs.close();;
}
void E32Parser::GetFileLayout(E32ImageHeader *result)
{
ReadFile();
iHdr = (E32ImageHeader*)iBufferedFile;
result = (E32ImageHeader*)iBufferedFile;
}

正如注释中指出的,您的问题是您正在修改传入的指针的副本。考虑这个小例子:

void modify(int* p) { p = new int{10}; }
int main()
{
int* n = nullptr;
modify(n);
if (n)
std::cout << *n;
}

该程序的输出什么都没有(并且会泄漏内存(。modify不会更改原始值,而是更改n的副本。解决此问题和程序的解决方法是通过引用传递指针。

void modify(int*& p) { p = new int{10}; }

void E32Parser::GetFileLayout(E32ImageHeader*& result)

但是,我认为更好的解决方法是返回指针,以防止此问题:

E32ImageHeader* E32Parser::GetFileLayout()
{
...
iHdr = (E32ImageHeader*)iBufferedFile;
return iHdr;
}

但是由于iHdr被传递给E32Parser,您可以将其更改为引用