You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Segmentation Fault (Core Dumped)求助:C++代码崩溃排查

C++段错误排查:索引越界与编译期常量问题

我的C++代码运行到第40行时触发signal: segmentation fault(cored dumped),我搞不懂崩溃原因——我觉得自己既没访问越界索引,也没修改字符串字面量。

需求逻辑是:当(k + i)大于N时,反向遍历数组patches找到值为“.”的位置,放置“G”或“H”。

输入示例:

1
5 4
GHHGG

编写的代码:

#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main() {
string cows;
int CONST_N = 100000;
array<string, 100000> patches;
int t, n, k, patchCounter{}; cin >> t;
  while(t--){ 
    patchCounter = 0;
    cin >> n; cin >> k;
    cin >> cows;
  //  cout << n << endl;
    for(int i = 0 ;i < CONST_N;i++){
  patches[i] = "N";
}
    for(int i = 0 ;i < n ;i++){
      patches[i] = ".";
    }
    for(int i = 0; i < n ;i++){
      if(cows.substr(i, 1) == "G"){
        if(patches[k + i] == "N"){
          for(int j = n - 1; j >=0;j++){
            if(patches[j] == "."){
              patches[j] = "G";
              break;
            }
        }
          } else {
          patches[k+i] = "G"; i+=(2*k); patchCounter++; 
          }
        }
      }
    for(int i = 0; i < n ;i++){
      if(cows.substr(i,1) == "H"){
         // cout<<(patches[k +i]  == "N") << endl;
        //cout << patches[k +i] << endl;
         if(patches[k + i] == "N"){
           cout << "hello";
          for(int j = n - 1; j >=0;j++){
            if(patches[j] == "."){
              patches[j] = "H";
              break;
            }
        }
          } else {
          patches[k+i] = "H"; i+=(2*k); patchCounter++; 
          }
        }
      }
    cout << patchCounter << endl;
    for(int i = 0 ;i < n ;i++){
      cout << patches[i];
    }
    cout << endl;
 
    }
  return 0;
}

我不确定问题所在,因为数组大小为10^5,而我仅访问了索引6,希望能获得帮助,谢谢!


崩溃根源分析

你忽略了C++std::array的核心要求:它的大小必须是编译期常量。你代码里的int CONST_N = 100000是运行期初始化的变量,无法作为array的模板参数,这会导致编译器无法正确分配数组内存,引发未定义行为,最终触发段错误。

另外还有两个潜在问题:

  1. 没有判断k+i是否超出n的范围,不符合你需求中“当(k+i)大于N时反向查找”的逻辑,可能导致逻辑错误。
  2. cows.substr(i,1)效率极低,直接用cows[i]访问字符更高效简洁。

修复方案

  1. 将CONST_N改为编译期常量,或改用std::vector(支持运行期指定大小,更灵活)。
  2. 增加k+i >= n的判断,匹配需求逻辑。
  3. 替换substr为直接字符访问。

修复后的代码示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    string cows;
    constexpr int CONST_N = 100000;
    vector<string> patches(CONST_N);
    int t, n, k, patchCounter{}; 
    cin >> t;
    
    while(t--){ 
        patchCounter = 0;
        cin >> n >> k;
        cin >> cows;
        
        fill(patches.begin(), patches.end(), "N");
        for(int i = 0 ;i < n ;i++){
            patches[i] = ".";
        }
        
        // 处理G
        for(int i = 0; i < n ;i++){
            if(cows[i] == 'G'){
                int pos = k + i;
                if(pos >= n || patches[pos] == "N"){
                    for(int j = n - 1; j >=0;j--){
                        if(patches[j] == "."){
                            patches[j] = "G";
                            break;
                        }
                    }
                } else {
                    patches[pos] = "G"; 
                    i += 2*k; 
                    patchCounter++; 
                }
            }
        }
        
        // 处理H
        for(int i = 0; i < n ;i++){
            if(cows[i] == 'H'){
                int pos = k + i;
                if(pos >= n || patches[pos] == "N"){
                    for(int j = n - 1; j >=0;j--){
                        if(patches[j] == "."){
                            patches[j] = "H";
                            break;
                        }
                    }
                } else {
                    patches[pos] = "H"; 
                    i += 2*k; 
                    patchCounter++; 
                }
            }
        }
        
        cout << patchCounter << endl;
        for(int i = 0 ;i < n ;i++){
            cout << patches[i];
        }
        cout << endl;
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Panini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:35:50