Category 皮肤鉴赏馆

上午好☀️☀️☀️️本答案参考通义千问

段错误(Segmentation Fault)是程序试图访问它不应该访问的内存区域,通常是因为:

访问了未初始化的指针越界访问数组或容器尝试修改只读内存使用了已释放的内存

在你的代码中,最可能的原因是越界访问数组或 vector。我们来详细分析并指出问题所在。

一、为什么会发生段错误?

1. vector a, b; 没有预先分配空间

你声明了 vector a, b, c(10001, 0);,但没有给 a 和 b 分配空间,比如 a.resize(n) 或 a.reserve(n)。然后你在循环中使用 a[i],这会导致越界访问,因为 a 是空的,不能通过 a[i] 来赋值。

for(int i=0; i < n; i++) {

cin >> a[i]; // 这里会出错!

}

原因: a 是一个空 vector,无法直接通过 a[i] 赋值。你需要先分配空间或者使用 push_back()。

二、如何修改?

✅ 解决方案如下:

1. 预分配 vector 空间

vector a(n), b(n), c(10001, 0);

这样 a 和 b 就有了 n 个元素的空间,可以安全地通过 a[i] 赋值。

2. 修正 erase 的逻辑(容易引发段错误)

在下面这段代码中:

for(int i = 0; i < n; i++) {

for(int j = 0; j < n; j++) {

if(c[j] == b[i]) {

if(c[j] > b[i]) { // 这个判断永远不成立

cnt++;

c.erase(c.begin() + j);

}

} else {

continue;

}

}

}

if (c[j] > b[i]) 是 永远为 false 的条件,因为 c[j] == b[i] 已经满足。erase 操作会改变 c 的大小,导致后续的 j 越界。

建议: 如果你想删除所有等于 b[i] 的元素,应该使用 remove 或 erase 结合迭代器。

三、完整修改后的代码如下:

#include

using namespace std;

int main() {

int n, cnt = 0;

cin >> n;

// 预分配空间

vector a(n), b(n), c(10001, 0);

for (int i = 0; i < n; i++) {

cin >> a[i];

}

for (int i = 0; i < n; i++) {

cin >> b[i] >> c[i];

}

sort(a.begin(), a.end());

sort(c.begin(), c.end());

// 修改后的 erase 逻辑(避免越界)

for (int i = 0; i < n; i++) {

for (int j = 0; j < c.size(); ) {

if (c[j] == b[i]) {

cnt++;

c.erase(c.begin() + j);

} else {

j++;

}

}

}

cout << cnt << endl;

return 0;

}

四、重点总结

✅ 段错误的主要原因:

未初始化 vector 或数组就访问其元素使用 erase 时没有处理迭代器变化,导致越界

✅ 改进方法:

预分配 vector 空间(如 vector a(n))避免使用 erase 时直接用 j 做索引,应使用迭代器或调整 j 的值检查逻辑是否合理(如 c[j] > b[i] 是否有意义)

如果你还有其他疑问,欢迎继续提问!

top
Copyright © 2088 英雄新物攻略库 - MOBA游戏活动智库 All Rights Reserved.
友情链接