将向量的整数内容打印为字符串会导致分段错误 [关闭]
Posted
技术标签:
【中文标题】将向量的整数内容打印为字符串会导致分段错误 [关闭]【英文标题】:Printing Integer Contents of a Vector as a String are Leading to Segmentation Fault [closed] 【发布时间】:2019-10-10 18:32:42 【问题描述】:我正在尝试通过使用连续的“*”字符来反映正态分布的条形来打印我的正态分布。程序在打印之前经常崩溃,但有时在打印之后。知道发生了什么吗?
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);
-- 这里有一个分号。投票结束是一个错字。
@PaulMcKenzie 好收获
您还应该发布minimal reproducible example。你缺少#include
s,eng3
的定义,...
@PaulMcKenzie 谢谢你的收获,我没注意到。
【参考方案1】:
这里多了一个分号:
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
获取的值是随机的,有时您可能最终会超出(向量的)内存访问,从而导致例如分段错误,这会调用 Undefined Behavior em> (UB)。
这可能解释了为什么您的代码有时会崩溃,而另一些则不会。
【讨论】:
以上是关于将向量的整数内容打印为字符串会导致分段错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章