类静态数组字段突然更改值(C++)

Class Static Array field change value suddenly(C++)

本文关键字:C++ 静态 数组 字段 突然      更新时间:2023-10-16

这是Block类的片段:

class Block { public:
    //size satu blok(dalam byte)
    static const int BLOCK_SIZE = 4096;    
    Block(int number,byte *data):number(number) {        
       for(int i=0;i<BLOCK_SIZE;i++) {
           this->data[i] = data[i];         
       }    
    }
    void test();
     private:
    byte data[BLOCK_SIZE];    
    const int number; };

注意,字节只是typedef无符号字符

这是其他类中初始化块变量的函数之一

bool Filesystem::getBlock(int number, Block *block) {        
    fstream fin(path);
    if(!fin.is_open() || number<0) {
        return false;
    }
    byte data[Block::BLOCK_SIZE];        
    fin.seekg(Block::BLOCK_SIZE*number,ios::beg);                       
    for(int i=0;i<Block::BLOCK_SIZE;i++) {
        fin>>data[i];                
    }
    block = new Block(number,data);    
    (*block).test();//this is the first test, this prints values as expected
    fin.close();
    return true;
}

这是另一个片段:

Block *superblock;
getBlock(0,superblock);
(*superblock).test();//this is the second test, this prints random value

test是打印块中数据的前四个字节的函数当我第一次在getblock中使用测试函数时,它会像我想要的那样打印(与文件相同(,但当我在调用getblock后第二次尝试打印时,它打印随机值

谁知道哪里出了错?

block = new Block(number,data);  

此行创建一个新的Block对象,并将其指定给参数block。但是,指针block通过值传递到函数中,因此原始指针superblock不受此行的影响。因此,您在函数内部和外部对不同的Block对象进行操作。

为了解决这个问题,您可以使用对指针的引用作为参数:

bool Filesystem::getBlock(int number, Block *&block);

这一行有几个错误:

fstream fin(path);

在这些线路上:

for(int i=0;i<Block::BLOCK_SIZE;i++) {
    fin>>data[i];                
}

第一行是错误的,因为你必须以二进制模式打开文件:

fstream fin(path, ios::binary);

另一个错误是,您将数据读取为字符,而不是二进制数据。此外,您不需要在循环中一次一个字节:

fin.read(data, Block::BLOCK_SIZE);

我还建议将fstream更改为ifstream,因为在函数中不会对文件进行任何输出。

另一个错误,正如在另一个答案中指出的,是如何传递block参数。

我不能仅从代码中判断,但看起来您可能只是将data的值存储在Block构造函数中,而不是将其内容复制到成员data数组中。data将在getBlock()结束时超出范围,这将使任何读取其内存的尝试无效。

您可能必须以二进制模式打开fin流。否则,'\r'个字符将丢失(跳过(。