【问题标题】:This code keeps outputting segmentation fault and I'm not sure why. Any suggestions?此代码不断输出分段错误,我不知道为什么。有什么建议么?
【发布时间】:2020-03-04 01:01:35
【问题描述】:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main() 
{

  int n;

  cin >> n; //currently 7

  while(n > 0)
  {

   for(int i = 0; i < n; i++)
   {

    if(i != 0)
    {
     //cout << i << "/" << n << endl;
     float test = 1.0 * i / n;
     vector<int> total(test);
     sort(total.begin(), total.end());
     cout << total[i] << endl;


    }
   }
   n--;
  }
}

编辑:粘贴我的整个代码。我只是有点困惑为什么它是一个分段错误。我检查了互联网,我认为这不是“访问释放的地址”、“不当使用 scanf”或未初始化的指针。

【问题讨论】:

  • 当您使用调试器运行程序时,您看到了什么?这就是调试器的用途。如果您不知道如何使用调试器,这是一个学习如何使用它来一次运行您的程序、监控所有变量及其变化时的值以及分析程序的逻辑执行流程的好机会。了解如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。
  • 向量声明需要在循环前,排序在循环后。
  • 请缩进以便阅读
  • Sam 上面关于运行调试器的建议不仅仅是一个简单的评论。这是个好建议。你知道如何使用你的调试器吗?
  • 在线您有onlinegdb.com,但您最好下载一份 Visual Studio Community 版本并在本地工作。总有一天,在线 IDE 将成为一个有效的选择,但现在……我记得有句老话是从靴子里倒出来的。

标签: c++ c++11 segmentation-fault


【解决方案1】:

这是一个分段错误,因为您正在访问未分配的内存。

total [i]

永远不会分配,因为在该行中:-

vector<int> total(test);

test 的值始终为 0,在循环内 i 始终小于 n,因此 i/n 必须为零 - C/C++ 语言将整数除法舍入为零(以及许多其他语言);因此在创建向量时不会向向量添加任何元素(您使用了填充构造函数)。

【讨论】:

  • 对不起,我对此很陌生。这是否意味着如果我将 vector 更改为 vector 它会起作用? (仍然说段错误)。因为如果我将其更改为浮动,它不会四舍五入为 0 对吗?这将是一个小数。
  • 这是否意味着如果我将 vector 更改为 vector 它会起作用? 不,它不会起作用。
  • @Sphinxtheriddlemaster 它不起作用的原因是您使用的 std::vector 的构造函数用数字 0 的“测试”副本填充向量,并且构造函数采用整数参数,所以当您传递一个小于零的浮点数时,它会转换为整数(即​​ 0),然后用于用零项填充向量。
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多