为什么指针在初始化后保持空点
Why pointer remains nullptr after initialisation
我编写了二进制解析器,它可以读取和打印有关文件的各种信息。出于速度原因,我希望直接使用 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
,您可以将其更改为引用
相关文章:
- 如何使用数据对象上的常量指针初始化类
- 使用指针初始化 char 数组或字符串 C++
- 使用无效指针初始化指针声明符的行为是否未定义?
- 指针:初始化与声明
- 启动线程会导致指针初始化时出现分段错误
- 使用函数声明进行函数指针初始化 - 是否可能
- 类初始化中的指针初始化
- 结构数组的指针初始化
- 如何从其抽象母类上的指针初始化子类?
- C 用结构指针初始化结构
- 如何用无效指针初始化unique_ptr的向量
- PCL中的这些增强指针初始化是不同的
- 通过指针初始化结构
- 从函数指针初始化成员函数
- 使用作用域内生成的指针初始化静态成员
- 使用"this"指针初始化 std::array
- C++缺乏指针初始化和使用逻辑
- constexpr 使用指针初始化
- C 指针初始化的不良初始化可能是什么后果
- 指针初始化无效?如果不是,那是什么