将向量的整数内容打印为字符串会导致分段错误 [关闭]

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 &gt;= 0 &amp;&amp; num &lt; 20); -- 这里有一个分号。投票结束是一个错字。 @PaulMcKenzie 好收获 您还应该发布minimal reproducible example。你缺少#includes,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)。

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

【讨论】:

以上是关于将向量的整数内容打印为字符串会导致分段错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

没有指针的 C++ 分段错误 (HackerRank)

C++ 向量分段错误

在 C++ 中使用向量时出现分段错误?

将 vector<string> 转换为 char** 会导致分段错误

带有 `\(var)` 的字符串会导致“展开可选值”错误