C++ C++;从新位置调用函数时出现分段错误

C++ C++;从新位置调用函数时出现分段错误,c++,linux,segmentation-fault,gdb,C++,Linux,Segmentation Fault,Gdb,我遇到了一个问题,当从不同的位置使用相同的参数调用相同的函数时,我会遇到分段错误。我试图在该函数中编写其他程序,但不知道为什么会出现seg故障。然后我把范围缩小到writeSector函数,所以我删除了所有其他函数,并试图找出为什么这会给我一个seg错误,但我仍然不知道为什么。下面是调用同一个函数,然后从另一个函数中调用该函数的示例: test[0] = '0'; test[1] = '0'; test[2] = '1'; test[3] = '0'; test[4] = '0'; test[5

我遇到了一个问题,当从不同的位置使用相同的参数调用相同的函数时,我会遇到分段错误。我试图在该函数中编写其他程序,但不知道为什么会出现seg故障。然后我把范围缩小到writeSector函数,所以我删除了所有其他函数,并试图找出为什么这会给我一个seg错误,但我仍然不知道为什么。下面是调用同一个函数,然后从另一个函数中调用该函数的示例:

test[0] = '0';
test[1] = '0';
test[2] = '1';
test[3] = '0';
test[4] = '0';
test[5] = '4';
test[6] = '0';
test[7] = '0';
test[8] = '5';
test[9] = '0';
test[10] = '0';
test[11] = '5';
test[12] = '0';
test[13] = '0';
test[14] = '6';
test[15] = '9';
test[16] = '9';
test[17] = '9';
disk->writeSector(0, test);
disk->writeSector(10, test);
disk->writeSector(10, test);
disk->writeSector(10, test);
disk->writeSector(10, test);
generateRootDir(10); //Seg fault here.
该函数实际调用的代码如下所示:

void FileSystem::generateRootDir(int rootBlock)
{
    disk->writeSector(10, test);
}
writeSector函数如下所示

void BlockDisk::writeSector(int address, char* block)
{
    if (address > blocks || address < 0)
    {
        std::cout << "[writeSector] ERROR: Sector " << address << " out  of bounds!" << std::endl;
    }
    std::fstream diskWrite;
    diskWrite.open(disk, std::ios::binary | std::ios::in | std::ios::out);
    if (diskWrite)
    {
        diskWrite.seekp(address*BLOCKSIZE, diskWrite.beg);  
        diskWrite.write(block, BLOCKSIZE);
        diskWrite.close();
    } else {
        printf("Error opening file to write\n");
        exit(-1);
    }
}
void BlockDisk::writeSector(int地址,char*block)
{
如果(地址>块| |地址<0)
{
std::cout如果此行成功:

disk->writeSector(10, test);
generateRootDir
中的同一行在
disk==NULL时失败:

void FileSystem::generateRootDir(int rootBlock)
{
    disk->writeSector(10, test);
}
然后,
disk
的值在第一个位置有效,但在第二个位置无效

很可能这两个
磁盘
引用了不同的变量(其中一个已正确初始化,另一个未正确初始化)


您可以在GDB中验证这一理论:
print&disk
将在
generateRootDir

writeSector内外产生不同的结果(this=0x0,
——看看
this
的值。这看起来对你来说正确吗,即一个伪对象?这就是为什么你应该发布一个,这样我们就知道变量来自何处以及它们是如何创建的,比如
磁盘
。试着运行你的代码。如果你在内存上不应该,它会告诉你ou.我不明白为什么这里的任何东西都会导致分段错误。--像访问有效对象一样访问空指针可以做到这一点,从您显示的输出来看,这就是它的样子。
磁盘
为空。如果没有更多代码,我们无法告诉您原因。是的,这就是问题所在。我应该在构造中初始化它或者,由于某种原因,它被重新声明并在代码行工作的函数中初始化。我确信这一切都是在构造函数中完成的,所以我甚至没有在那里寻找问题。
disk->writeSector(10, test);
void FileSystem::generateRootDir(int rootBlock)
{
    disk->writeSector(10, test);
}