今天敲代码时遇见了一种情况,发生了段错误
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
void solve() {
ll a,b,c,d;
string ssr;
cin>>n;
cin>>ssr;
vector<vector<int> >p(n+10);
if(n==1)
{
cout<<0;
return;
}
for(a=1;a<=n-1;a++)
{
cin>>b>>c;
p[b].push_back(c);
//p[c].push_back(b);
}
ll sum=0;
for(a=1;a<=n;a++)
{
for(b=0;b<=p[a].size()-1;b++)
{
if(ssr[a-1]==ssr[p[a][b]-1])
{
sum++;
}
}
}
cout<<sum;
return;
}
signed main() {
int t=1;
//cin >> t;
while (t--) {
solve();
}
}
找了半天发现问题
for (b = 0; b <= p[a].size() - 1; b++)//段错误
//正确
int x = p[a].size() - 1;
for (b = 0; b <= x; b++)
问题在于:size()
方法返回的 unsigned
类型有关。在 C++ 中,vector
的 size()
方法返回的是 size_t
类型。
size_t
是无符号类型:size_t
用于表示对象的大小,通常为unsigned int
或unsigned long
,具体取决于平台和编译器。
无符号整数减法: 当对无符号整数执行减法操作时,如果结果为负数,结果将回绕到该类型的最大值。例如,
0 - 1
在unsigned
类型中会变成UINT_MAX
。
我这里的 p[a].size()
是 size_t
类型。假设 p[a].size()
为 0
,那么 p[a].size() - 1
将变成 SIZE_MAX
一个非常大的数,从而引发错误。
解决方法:
1.转换为 int
类型
for(b=0;b<=int(p[a].size()-1);b++)
2. (range-based for
loop)语法
for(int b : p[a])
3.不使用无符号数进行运算操作
for(b=0;b<p[a].size();b++)