loop-malloc.c 的向量中的分段错误:没有这样的文件或目录

Posted

技术标签:

【中文标题】loop-malloc.c 的向量中的分段错误:没有这样的文件或目录【英文标题】:Segmentation fault in vector for loop-malloc.c: No such file or directory 【发布时间】:2016-03-27 01:55:05 【问题描述】:

对于背包问题的贪心算法,我在以下代码中遇到分段错误。尽管我见过它们,但我以前从未成功解决过分段错误,因此我将不胜感激。

我在运行调试器时收到的消息是没有“malloc.c”。当我运行 valgrind 时,我得到一个“4 号大小的无效读取”。在这与错误的性质之间,我猜我正在尝试访问一个不存在的向量元素。但是我已经尝试了所有我能想到的方法来确保循环在遍历向量时不会超出其界限。

(我在没有使用基于 C++11 范围的 for 循环的情况下完成了此操作,但仍然得到相同的错误。我为 for 循环的参数选择什么似乎并不重要,它仍然会抛出一个分割错误。)

提前致谢。

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;

bool decreaseSort(int a, int b)

   return a > b;   //sort by decreasing value for better performance


double get_optimal_value(int capacity, vector<int> weights, vector<int> values) 

sort(weights.begin(),weights.end(), decreaseSort); 
sort(values.begin(),weights.end(), decreaseSort);

vector<int> ourKnapsack(values.size(), 0);

double totalValue = 0.0;
int ourInput = 0;

for (auto i : ourKnapsack)
  int ourValue = values.at(i);
  int ourWeight = weights.at(i);
  double unitValue = (double)ourValue/ourWeight;
  if (capacity == 0) 
      return totalValue;


  if (weights.at(i) < capacity)
      ourInput = weights.at(i);
  
  else 
      ourInput = capacity;
  


  totalValue = totalValue * (ourInput * unitValue); 
  weights.at(i)-=ourInput;
  ourKnapsack.at(i)+=ourInput;
  capacity-=ourInput;

 
 return totalValue;


  int main() 
  int n = 3;
  int capacity = 50;

  vector<int> values(n);
  values = 60,100,120;
  vector<int> weights(n); 
  weights = 20,50,30;

  double optimal_value = get_optimal_value(capacity, weights, values);

  std::cout.precision(10);
  std::cout << optimal_value << std::endl;
  return 0;

【问题讨论】:

我完全专注于处理向量和循环的代码,因为我看到了“分段”这个词,但忽略了排序...谢谢。 这就是“未定义行为”的意思。这并不意味着“立即出现分段错误”。这意味着“从现在开始,任何事情都可能发生”。立即出现分段错误是一种可能性。代码一瘸一拐,一段时间,然后爆炸,也是另一种可能性,也完全限定为“未定义的行为”。欢迎使用 C++。 【参考方案1】:
sort(values.begin(),weights.end(), decreaseSort);

那是你的问题,就在那里。哎呀。

显然,应该是values.end(),而不是weights.end()

【讨论】:

以上是关于loop-malloc.c 的向量中的分段错误:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

C ++中向量中的分段错误

向量中的字符串交集给出分段错误

C ++中动态分配的向量中的分段错误

向量中的字符串交集给出分段错误

带有向量迭代器的程序中的分段错误

堆内存中的 C++ 向量导致分段错误