gpt4 book ai didi

C++ char数组复制到unsigned char数组

转载 作者:行者123 更新时间:2023-11-28 00:58:24 25 4
gpt4 key购买 nike

我正在尝试读取文件并将信息存储在无符号字符数组中。但是,我的程序似乎正在覆盖变量。

A 类 header :

...
public:
ClassA(void);
void LoadMemoryBlock(char* block, int bank);
....
private:
unsigned char upperMemoryBank1[16384];
unsigned char upperMemoryBank2[16384];
....

A 类文件:

ClassA::ClassA(void)
{
}
...
void ClassA::LoadMemoryBlock(char* block, int bank)
{
if (bank == 1)
{
memcpy(upperMemoryBank1, block, 16384);
}
else if (bank == 2)
{
memcpy(upperMemoryBank2, block, 16384);
}
}

B 类 header :

...
private:
ClassA* classAobject;
...

B 类文件:

ClassB::ClassB()
{
classAobject = &ClassA();
...
}
...
ClassB::StoreFile(ifstream &file)
{
int position;

char fileData[16384];

position = file.tellg();
file.seekg(HEADER_SIZE, ios::beg);
position = file.tellg();
file.read(fileData, 16384);
position = file.tellg();
classAobject->LoadMemoryBlock(fileData, 1);
classAobject->LoadMemoryBlock(fileData, 2);

position = file.tellg(); // Crashes here
file.seekg(16384 + HEADER_SIZE, ios::beg);
...
}

在我的调试器中观察位置变量表明,在 LoadMemoryBlock 调用之后,它不再像之前那样显示 16400,而是每次都不同的随机数。此外,文件 ifstream 也被 LoadMemoryBlock 调用损坏。所以我猜测 memcpy 正在覆盖它们。

我尝试以不同方式初始化数组,但现在 memcpy 崩溃了!

A 类 header :

...
public:
ClassA(void);
void LoadMemoryBlock(char* block, int bank);
....
private:
unsigned char* upperMemoryBank1;
unsigned char* upperMemoryBank2;
....

A 类文件:

ClassA::ClassA(void)
{
upperMemoryBank1 = new unsigned char[16384];
upperMemoryBank2 = new unsigned char[16384];
}
...
void ClassA::LoadMemoryBlock(char* block, int bank)
{
if (bank == 1)
{
memcpy(upperMemoryBank1, block, 16384); // Crashes here
}
else if (bank == 2)
{
memcpy(upperMemoryBank2, block, 16384);
}
}

B 类 header :

...
private:
ClassA* classAobject;
...

B 类文件:

ClassB::ClassB()
{
classAobject = &ClassA();
...
}
...
ClassB::StoreFile(ifstream &file)
{
int position;

char* fileData = new char[16384];

position = file.tellg();
file.seekg(HEADER_SIZE, ios::beg);
position = file.tellg();
file.read(fileData, 16384);
position = file.tellg();
classAobject->LoadMemoryBlock(fileData, 1);
classAobject->LoadMemoryBlock(fileData, 2);

position = file.tellg();
file.seekg(16384 + HEADER_SIZE, ios::beg);
...
}

我认为这些方法中至少有一种(如果不是两种)应该有效。我做错了什么?

编辑:我在上面包含了 ClassA 初始化。

这就是我调用 StoreFile 方法的方式:

bool ClassB::Load(char* filename)
{
ifstream file(filename, ios::in|ios::binary);

if(file.is_open())
{
if(!StoreFile(file))
{
return false;
}

file.close();
return true;
}

printf("Could not open file: %s\n", filename);
return false;
}

最佳答案

99% 的可能性错误是在任何初始化 classAobject 指针值的代码中。如果它指向 ClassA 对象的合法实例,则代码应该没问题。

更新:是的。就是这样。

classAobject = &ClassA();

这将创建一个新的 ClassA 对象,然后存储指向它的指针。但是在语句的末尾,它超出了范围并被销毁,留下 classAobject 持有指向不存在的对象的指针。你想要:

classAobject = new ClassA();

不要忘记三个规则——在析构函数中删除它,在operator= 和复制构造函数中分配一个新的。或者更好的是,根据所需的语义,使用更像智能指针的 C++ 方法。

关于C++ char数组复制到unsigned char数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9968597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com