c++ - 将 vector 的整数内容打印为字符串会导致段错误

标签 c++ vector random segmentation-fault

<分区>

我试图通过使用连续的“*”字符来反射(reflect)正态分布的条形来打印我的正态分布。该程序经常在打印之前崩溃,但有时会在打印之后崩溃。知道发生了什么事吗?

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 作为索引对 vector 进行索引,而不检查值是否在范围内。

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

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

关于c++ - 将 vector 的整数内容打印为字符串会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58329094/

相关文章:

c++ - 捕获/重定向 cout 到一个函数

c++ - 多次使用 QNetworkAccessManager GET

c++ - 将 uint8 vector 转换为 ascii 十六进制字符串的更好方法

C++ 清除结构 vector 异常

c++ - 如何将 std::vector<boost::shared_ptr<T>> 复制到 std::list<T>

r - 通过 vector 分配多个列而不回收

java - 如何获得循环内每个商品的总销售成本?

c++ - 无法使用 fstream 将中文字符写入文本文件

ruby - Ruby 有随机数生成器类吗?

c - C 编程中的 rand() 问题?