为什么我会遇到分段错误?瓦尔格林德



我编写了一个程序来确定两个字符串之间最长的公共子序列。我已经用一个小的硬编码测试用例测试了我的函数LCSLength(),它返回了正确的值。

现在,我

正在从文件中读取字符串进行比较,我的程序给了我一个分段错误。这是代码:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
int LCSLength(string X,string Y);
int main()
{
    ifstream inData("sequences.dat");
    vector<string> lines(1);
    string line;
    int LCS;
    while (getline(inData,line)) 
    {
        if (line.empty()) 
            lines.push_back("");
        else 
            lines.back() += line;
    }
    LCS = LCSLength(lines[0],lines[1]);
    cout << "The LCS is: " << LCS << endl;
    return 0;
}

int LCSLength(string X,string Y)
{
    int m = X.size();
    int n = Y.size();
    int L[m+1][n+1];
    for(int i=0; i<=m; i++)
    {
        for(int j=0; j<=n; j++)
        {
            if(i==0 || j==0)
                L[i][j] = 0;
            else if(X[i-1]==Y[j-1])
                L[i][j] = L[i-1][j-1]+1;
            else
                L[i][j] = max(L[i-1][j],L[i][j-1]);
        }
    }
    return L[m][n];
}

当我使用 -pedantic -ansi 编译时,我收到以下错误:在函数 LCSLength(std::string, std::string) 中:ISO C++禁止可变大小数组 'L'。

我使用 Valgrind 编译,以下是它产生的错误:

==15183== LEAK SUMMARY:
==15183==    definitely lost: 8,624 bytes in 14 blocks
==15183==    indirectly lost: 1,168 bytes in 5 blocks
==15183==      possibly lost: 5,518 bytes in 58 blocks
==15183==    still reachable: 44,925 bytes in 278 blocks
==15183==         suppressed: 0 bytes in 0 blocks
==15183== Reachable blocks (those to which a pointer was found) are not shown.
==15183== To see them, rerun with: --leak-check=full --show-reachable=yes
==15183== 
==15183== ERROR SUMMARY: 23 errors from 23 contexts (suppressed: 0 from 0)
==15183== 
==15183== 1 errors in context 1 of 23:
==15183== Invalid read of size 4
==15183==    at 0x38326: std::string::_Rep::_M_grab(std::allocator<char> const&, std::allocator<char> const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x388EF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x100001AAE: main (firstt.cpp:23)
==15183==  Address 0xfffffffffffffff8 is not stack'd, malloc'd or (recently) free'd
==15183== 
==15183== 
==15183== 1 errors in context 2 of 23:
==15183== Invalid read of size 8
==15183==    at 0x388DC: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x100001AAE: main (firstt.cpp:23)
==15183==  Address 0x100023d28 is 0 bytes after a block of size 8 alloc'd
==15183==    at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==15183==    by 0x4B346: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==15183==    by 0x100002DFE: __gnu_cxx::new_allocator<std::string>::allocate(unsigned long, void const*) (new_allocator.h:91)
==15183==    by 0x100002E42: std::_Vector_base<std::string, std::allocator<std::string> >::_M_allocate(unsigned long) (stl_vector.h:131)
==15183==    by 0x100002E9D: std::_Vector_base<std::string, std::allocator<std::string> >::_Vector_base(unsigned long, std::allocator<std::string> const&) (stl_vector.h:116)
==15183==    by 0x1000030E4: std::vector<std::string, std::allocator<std::string> >::vector(unsigned long, std::string const&, std::allocator<std::string> const&) (stl_vector.h:215)
==15183==    by 0x1000017D9: main (firstt.cpp:11)
==15183== 
==15183== ERROR SUMMARY: 23 errors from 23 contexts (suppressed: 0 from 0)
Segmentation fault: 11

我的测试文件有两行序列。我检查lines.size(),它返回 2。我还cout << lines[0]cout << lines[1]并打印了正确的字符串。

谁能帮我弄清楚这一点?谢谢。

你的lines向量总是包含一个元素,因此通过索引 1 访问它会导致 UB

LCS = LCSLength(lines[0],lines[1]);
                          here ^  

您是否确认退出 while 循环后,lines[0]lines[1]都存在?仅当输入文件中至少有一个空行(并被识别为空行)时,才会发生这种情况。

根据 Valgrind 的说法(请阅读其输出!) - 您从 main 内部(第 11 或 23 行)而不是从LCSLength做错了什么。

相关内容

  • 没有找到相关文章

最新更新