将矢量的整数内容打印为字符串会导致分割错误

Printing Integer Contents of a Vector as a String are Leading to Segmentation Fault

本文关键字:字符串 错误 分割 打印 整数      更新时间:2023-10-16

我正在尝试通过使用连续的"*"字符来打印我的正态分布来反映正态分布的条形。程序通常在打印之前崩溃,但有时会在打印后崩溃。知道发生了什么吗?

int main() {
std::normal_distribution<double> normDist(10.0, 4.0); 
vector<int> v(20); // All zeros.
for (int i{}; i < 500; i++) {
int num = normDist(eng3);
if (num >= 0 && num < 20);
v[num]++;
}
for (int i{}; i < 20; i++) {
cout << i << ": " << std::string(v[i], '*') << endl;
}
}

结果:

0: *****
1: ***
2: *******
3: *******
4: ***********************
5: *********************
6: **********************************
7: **********************************
8: ********************************************
9: ********************************************
10: ****************************************************
11: **********************************************
12: *****************************************
13: **************************************************
14: ************************************
15: *******************
16: ************
17: ********
18: *******
19: **
double free or corruption (out)
Aborted (core dumped)

这里有一个额外的分号:

if (num >= 0 && num < 20);   // <- extra semicolon results in empty body
v[num]++;

正如@PaulMcKenzie所发现的那样。此代码具有与此代码相同的效果:

if (num >= 0 && num < 20)
{
// nothing here
}
v[num]++;

因此,发生的情况是,您使用num作为索引来索引向量,而不检查值是否在范围内。

因此,由于num获取的值是随机的,有时您最终可能会超出(向量(访问内存,从而导致分段错误,例如调用未定义行为(UB(。

这可能解释了为什么你的代码有时会崩溃,而另一些时候则不会。