2012-12-05 44 views
0

我写了一个程序来确定两个字符串之间的最长公共子。我用一个硬编码的小测试用例测试了我的函数LCSLength(),它返回正确的值。为什么我得到分段错误? Valgrind的?

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

#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]和正确的字符串被打印出来。

谁能帮我想出解决办法?谢谢。

+0

我想,那是因为你不能做到这一点:INT L [M + 1] [N + 1]; 编译器不知道X和Y的大小在编译时,与L阵列将不会被正确地初始化。尝试用值初始化 – Pavenhimself

回答

0

lines矢量始终包含一个元素,因此通过索引1 accesing它会导致UB

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

你确认退出while循环后,无论是lines[0]lines[1]存在吗?只有在输入文件中至少有一个空行(并且如此识别)时才会发生这种情况。

根据Valgrind的(不要读它的输出!) - 你正在做的事情错了,从内mainLCSLength(线11或23),而不是。

相关问题