![](/img/trans.png)
[英]How to convert unsigned char* to an unsigned char array in C/C++?
[英]C++ char array copy to unsigned char array
我正在嘗試讀取文件並將信息存儲在未簽名的char數組中。 但是,我的程序似乎正在覆蓋變量。
ClassA標頭:
...
public:
ClassA(void);
void LoadMemoryBlock(char* block, int bank);
....
private:
unsigned char upperMemoryBank1[16384];
unsigned char upperMemoryBank2[16384];
....
ClassA文件:
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);
}
}
ClassB標頭:
...
private:
ClassA* classAobject;
...
ClassB文件:
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);
...
}
觀察調試器中的position變量,可以看到在LoadMemoryBlock調用之后,它不再像以前那樣顯示16400,而是每次都不同的隨機數。 同樣,文件ifstream也被LoadMemoryBlock調用損壞。 所以我猜測memcpy正在覆蓋它們。
我嘗試以不同的方式初始化數組,但是現在memcpy崩潰了!
ClassA標頭:
...
public:
ClassA(void);
void LoadMemoryBlock(char* block, int bank);
....
private:
unsigned char* upperMemoryBank1;
unsigned char* upperMemoryBank2;
....
ClassA文件:
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);
}
}
ClassB標頭:
...
private:
ClassA* classAobject;
...
ClassB文件:
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;
}
該錯誤發生在任何代碼初始化classAobject
指針的值中的classAobject
99%。 如果它指向ClassA
對象的合法實例,則代碼應該沒問題。
更新 :是的。 就是這樣
classAobject = &ClassA();
這將創建一個新的ClassA對象,然后存儲一個指向它的指針。 但是在該語句的末尾,它超出范圍並被破壞,使classAobject
持有指向不存在對象的指針。 你要:
classAobject = new ClassA();
不要忘記三個規則-在析構函數中將其delete
,在operator=
和復制構造函數中分配一個新規則。 或更妙的是,根據所需的語義,使用更多的C ++方法(如智能指針)。
在ClassB
構造函數中,您正在初始化classAobject
指針,該指針指向臨時變量的地址,該臨時變量在構造函數返回后立即變為無效。 這是問題的原因。 使用new
創建適當的堆對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.