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的模板参数,这会导致编译器无法正确分配数组内存,引发未定义行为,最终触发段错误。
另外还有两个潜在问题:
- 没有判断
k+i是否超出n的范围,不符合你需求中“当(k+i)大于N时反向查找”的逻辑,可能导致逻辑错误。 cows.substr(i,1)效率极低,直接用cows[i]访问字符更高效简洁。
修复方案
- 将
CONST_N改为编译期常量,或改用std::vector(支持运行期指定大小,更灵活)。 - 增加
k+i >= n的判断,匹配需求逻辑。 - 替换
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
相关产品推荐
相关产品推荐

