从新位置调用函数时C 细分故障



我遇到一个问题,当调用来自其他位置的相同参数的相同函数时,我会遇到分割错误。我试图在该功能中编程其他内容,并且不知道为什么我会遇到SEG错误。然后,我将其范围缩小到写入器功能,因此我删除了其他所有内容,并试图弄清楚为什么这给我带来了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);
}

写入器函数如下所示。

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 writen");
        exit(-1);
    }
}

我试图在GeneratoRootDir功能调用上方设置一个断路点。这是给定的输出,一切对我来说都还不错,我看不出为什么这里有任何会导致分割错误。

Breakpoint 1, FileSystem::mount (this=0x55555576bc20) at FileSystem.cpp:55
55          disk->writeSector(10, test);
(gdb) s
BlockDisk::writeSector (this=0x55555576c0c0, address=10,
    block=0x55555576bc90 "001004005005006999") at BlockDisk.cpp:21
21          if (address > blocks || address < 0)
(gdb) s
25          std::fstream diskWrite;

,然后写入器函数的其余部分顺利进行。然后致电GeneratoToRootDir:

FileSystem::mount (this=0x55555576bc20) at FileSystem.cpp:56
56          generateRootDir(10);
(gdb) s
FileSystem::generateRootDir (this=0x55555576bc20, rootBlock=10)
    at FileSystem.cpp:147
147         disk->writeSector(10, test);
(gdb) s
BlockDisk::writeSector (this=0x0, address=10,
    block=0x55555576bc90 "001004005005006999") at BlockDisk.cpp:21
21          if (address > blocks || address < 0)
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x0000555555556733 in BlockDisk::writeSector (this=0x0, address=10,
    block=0x55555576bc90 "001004005005006999") at BlockDisk.cpp:21
21          if (address > blocks || address < 0)
(gdb) s

两个呼叫的GDB似乎都一样,但都给出了分割故障。对此的任何帮助将不胜感激。

如果这一行成功:

disk->writeSector(10, test);

generateRootDir中的相同线路与disk == NULL失败:

void FileSystem::generateRootDir(int rootBlock)
{
    disk->writeSector(10, test);
}

然后,disk的值在第一个位置有效,但在第二个位置无效。

很可能这两个 disk s是指不同的变量(其中一个已正确初始化,另一个没有)。

您可以在GDB中验证该理论:print &disk将在generateRootDir内外产生不同的结果。

相关内容

  • 没有找到相关文章

最新更新