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

C++ 类静态数组字段值突然更改(C+;+;),c++,C++,这是块类的代码段: 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];

这是块类的代码段:

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; };
test是一个从数据块中打印前四个字节的函数 当我第一次在getblock中使用test函数时,它会像我想要的那样打印(与文件相同),但是当我在调用getblock之后第二次尝试打印它时,它会打印随机值


有人知道错误在哪里吗?

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

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

block = new Block(number,data);  
此行创建一个新的
Block
对象,并将其分配给参数
Block
。但是,指针
通过值传递到函数中,因此原始指针
超级块
不受此行影响。因此,您在函数内部和外部对不同的
-对象进行操作

要解决此问题,可以使用指针引用作为参数:

bool Filesystem::getBlock(int number, Block *&block);
此行创建一个新的
Block
对象,并将其分配给参数
Block
。但是,指针
通过值传递到函数中,因此原始指针
超级块
不受此行影响。因此,您在函数内部和外部对不同的
-对象进行操作

要解决此问题,可以使用指针引用作为参数:

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

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

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

这一行有几个错误:

fstream fin(path);
在这些方面:

for(int i=0;i<Block::BLOCK_SIZE;i++) {
    fin>>data[i];                
}
另一个错误是将数据读取为字符,而不是二进制数据。此外,您不需要在循环中一次使用一个字节:

fin.read(data, Block::BLOCK_SIZE);
我还建议将
fstream
更改为
ifstream
,因为您不在函数中对文件进行任何输出


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

这一行有几个错误:

fstream fin(path);
在这些方面:

for(int i=0;i<Block::BLOCK_SIZE;i++) {
    fin>>data[i];                
}
另一个错误是将数据读取为字符,而不是二进制数据。此外,您不需要在循环中一次使用一个字节:

fin.read(data, Block::BLOCK_SIZE);
我还建议将
fstream
更改为
ifstream
,因为您不在函数中对文件进行任何输出


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

您只需执行
block->test()
而不是
(*block).test()
。一个小建议是:在
block
构造函数中,使用函数,而不是在循环中一次复制一个字节的数据。它针对这类事情进行了优化。您只需执行
block->test()
而不是
(*block).test()
。一个小建议:在
block
构造函数中,使用函数,而不是在循环中一次复制一个字节的数据。它针对这类事情进行了优化。构造函数正确地复制了数据,这不是问题。构造函数正确地复制了数据,这不是问题。嗯,我得到了文件系统。h:28:38:错误:无法声明指向“类块&”文件系统的指针。cpp:68:47:错误:无法声明指向“类块&”的指针。我意识到了这一点,但评论晚了。谢谢你的帮助!嗯,我得到了文件系统。h:28:38:错误:无法声明指向“类块&”文件系统的指针。cpp:68:47:错误:无法声明指向“类块&”的指针。我意识到了这一点,但评论晚了。谢谢你的帮助!谢谢你的建议。至于我为什么每次使用循环一个字节来填充数据,是因为fin.read()需要char*(这里的数据是byte*)@bysreg我猜
byte
只是
char
的一个typedef。在标准C或C++中没有<代码>字节<代码>类型。至于我为什么每次使用循环一个字节来填充数据,是因为fin.read()需要char*(这里的数据是byte*)@bysreg我猜
byte
只是
char
的一个typedef。标准C或C++中没有<代码>字节<代码>类型。