大型递归字符串操作上的分段错误

segmentaion fault on large recursive string manipulation

本文关键字:分段 错误 操作上 递归 字符串 大型      更新时间:2023-10-16

我正在www.adventofcode.com/day/10 上挑战

我有一个我认为有效的代码,我使用c++只是为了在享受乐趣的同时学习。

我正在做递归字符串操作。这里的问题是程序因分段故障而崩溃当执行超过38次迭代时,在行"char-ch=line[0]"上。

#include <iostream>
#include <string>
using namespace std;
string count_chars(string line){
    char ch = line[0];
    uint i;
    for(i = 0; ch == line[i]; i++){
    }
    if(i != line.length()){
        line = to_string(i) + ch + count_chars(line.substr(i));
    }
    else{
        line = to_string(i) + ch;
    }
    return line;
}
int main(int argc, char** args)
{
    //ifstream in("dayx");
    /*
    if(argc ==1)
        return 1;
    string line;
    cout << line.capacity() << endl;
    line = args[1];
    */
    string line = "1";
    for(int i = 1; i < 40; i++){
        line = count_chars(line);
        //cout << line << " after " << i << " iterations" << endl;
        cout <<"Line size: " << line.size() << endl;
    }
    cout << line << endl;
}

代码使用编译

g++ day10.cpp --std=c++11 -g

我的问题是,为什么会发生这种情况,我如何防止它,我如何使用gdb来解决这个问题?谢谢

我使用的是linux和gcc 5.3

由于递归太深(数千次调用深度),导致堆栈溢出。您可以使用循环来轻松地实现该算法。

我怀疑任何访问可能不存在的字符串索引的代码行:

   char ch = line[0];
    uint i;
    for(i = 0; ch == line[i]; i++){
    }
    if(i != line.length()){
        line = to_string(i) + ch + count_chars(line.substr(i));
  1. 即使字符串为空,它也会从字符串中获取第一个字符。

  2. 它只是检查i是否与字符串的长度相同,而不是检查i是否大于字符串的长度。