簡體   English   中英

C ++ char數組復制到無符號char數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM