Sort() 导致分段错误

Posted

技术标签:

【中文标题】Sort() 导致分段错误【英文标题】:Sort() leads to Segmentation Fault 【发布时间】:2014-03-12 03:58:02 【问题描述】:

我必须实现一个shuffleString(string s,int d) 方法,其中第一步涉及获取字符串中每个字符的计数并按计数的递减顺序排列它们。我实现了所需的功能如下:

 struct node
    char ch;
    int ctr;
 ;
 bool myfunc(const struct node x,const struct node y)
    return (x.ctr>=y.ctr?true:false);
 
 string shuffleString(string s,int d)
     int i,j;
     int len=s.size();
     vector<struct node> counter(26);
     for(i=0;i<26;i++)
         counter[i].ch='a'+i;
         counter[i].ctr=0;
     
     for(i=0;i<len;i++)
         counter[s[i]-'a'].ctr++;
     
     sort(counter.begin(),counter.end(),myfunc);//From STL's algorithm
     /*
       Remaining Functionality
     */
  

但是,当调用sort() 方法时,代码会生成一个segmentation fault。我的代码有什么问题?请帮忙。

附:该字符串仅包含小写 ASCII 字符。

【问题讨论】:

到目前为止你对debug your small program做了什么? 想不到太多...在myfunc()方法中写了一个print语句。排序方法似乎在无休止地运行。 此外,当我删除语句中的 '=' 时,'return (x.ctr>=y.ctr?true:false);'程序似乎执行了。 【参考方案1】:

试试这个

bool myfunc(const struct node x,const struct node y) return (x.ctr>y.ctr) || (x.ctr == y.ctr && x.ch < y.ch);

编辑:

    您应该处理break tie case(单独的&gt;== 情况,而不是&gt;=) 当输入包含除a-z 以外的任何字符(甚至是A-Z)时,您的算法将失败

这里有个小sn-p:

struct node
    char ch;
    int ctr;
;
bool myfunc(const struct node x,const struct node y)
    return (x.ctr>y.ctr) || (x.ctr == y.ctr && x.ch < y.ch);

void shuffleString(string s)
   int i,j;
   int len=s.size();
   vector<struct node> counter(26);
   for(i=0;i<26;i++)
      counter[i].ch='a'+i;
      counter[i].ctr=0;
   
   for(i=0;i<len;i++)
      counter[s[i]-'a'].ctr++;
   
   for(int i=0; i<26;i++) cout << counter[i].ch <<"," << counter[i].ctr  << endl;

   cout << endl << endl;

   sort(counter.begin(),counter.end(), myfunc);//From STL's algorithm

   for(int i=0; i<26;i++) cout << counter[i].ch <<"," << counter[i].ctr  << endl;



int main()

   shuffleString("hello");

   return 0;

【讨论】:

【参考方案2】:

您可能在以下行中出现内存损坏:counter[s[i]-'a'].ctr++;

s[i]-'a' 可以大于 25,什么是超出向量边界的。

【讨论】:

字符串中只有小写的 ASCII 字符。问题已编辑。【参考方案3】:

stl sort 默认使用operator&lt; - 它期望您传入的函数以相同的方式运行。

这意味着如果它在两个相同的值上调用该函数,它应该得到 false,但在你的情况下它会得到 true。因此,它不会正确排序。

当您删除 = 时,该函数不再存在此问题,因为 operator&gt;operator &lt; 一样是非自反的

如果您使用调试 c 运行时运行,STL 将首先断言传入的函数格式正确。

【讨论】:

删除“=”会改变相对顺序?无论如何...谢谢..我得到了错误。

以上是关于Sort() 导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的字符串分配会导致分段错误?

为啥释放内存会导致分段错误?

确定导致分段错误的代码行?

带有 ifort 的 tracebackqq() 导致分段错误

为啥重新声明 std::cout 会导致分段错误?

启动线程导致指针初始化时出现分段错误