【问题标题】:C++ Array of Array Products :exited, segmentation faultC++ Array of Array Products :exited,segmentation fault
【发布时间】:2021-02-16 05:25:02
【问题描述】:

我是 cpp 领域的新手。 下面是我的cpp代码。当我使用在线 c++ 编译器时, 为什么会发生退出、分段错误以及我的代码有什么问题。 谢谢大家。

问题描述: 给定一个整数数组 arr,要求您计算每个索引 i 的所有整数的乘积,除了该索引处的整数(即除 arr[i] 之外)。实现一个函数 arrayOfArrayProducts,它接受一个整数数组并返回一个产品数组。 在不使用除法的情况下求解并分析解决方案的时间和空间复杂性。

#include <iostream>
#include <vector>

using namespace std;

vector<long> arrayOfArrayProducts(const vector<int>& arr) 
{
  vector<long> res = {};
  int n = arr.size();
  // handles edge cases as well
  if(n==0 || n==1){
    return res;
  }
  

  int product;
  // your code goes here
  for(int i=0; i<n; i++){
    product = 1;
    for(int j=0; j<n; j++){
      if(i!=j){
        product = arr[j]*product;
      }
    res[i]=product;
    }  
  }

  return res;
}

int main() {
  // vector initiallize
  //vector<int> arr{8, 10, 2};
  const vector<int> arr;

  int n = arr.size();

  
  vector<long> ans(n,0);
  ans = arrayOfArrayProducts(arr);
  for(int i=0; i<n; i++){
    cout<< ans[i] <<' ';
  }
  return 0;
}

【问题讨论】:

  • 你忘了给res一个实际大小。因此,由于向量不包含任何元素,任何 ires[i] 将具有未定义的行为。考虑使用res.push_back(product); 而不是res[i] = product;,但请确保您在j 循环外部 执行此操作,而不是像您现在所做的那样在其中执行此操作——还要注意n == 1 的特殊情况将中断调用者,因为这也返回一个空向量,但调用者假定它有 1 个元素。
  • 如果您不知道向量的大小,可以使用 push_back 等方法将数据插入到向量中,它会根据需要自动调整大小。
  • 谢谢大家,非常感谢!

标签: c++ arrays vector


【解决方案1】:

这是失败的地方:

res[i] = product;

原因是你声明 res 是这样的:

vector<long> res = {};

所以您试图访问位于空向量的“单元”ilong 元素...这在 C++ 中是不允许的,结果是 undefined behavior

修复它:

和main函数中的方法一样

std::vector<long> arrayOfArrayProducts(const std::vector<int>& arr)
{ 
     int n = arr.size(); 
     std::vector<long> res(n, 0);
     ....

【讨论】:

  • 感谢详细原因的描述。我学到了很多东西!我曾想过“vector res = {};”是过去C语言的一种很好的初始化写法。为什么在 C++ 中不允许?
【解决方案2】:

当您尝试读取超出数组的边界时,通常会发生分段错误。您的代码中的此错误意味着您正在尝试从未分配的数组中读取/写入某些内容。如果您仔细观察,res[i]=product 表示您从向量 res 访问元素。但是您还没有重新分配向其中插入数据。这就是分段错误的原因。

要解决此问题,请将res 向量的大小调整为arr 的大小,以便该向量具有内存中要访问的元素,

vector<long> arrayOfArrayProducts(const vector<int>& arr) 
{
  vector<long> res(srr.size());
  ...

【讨论】:

  • 感谢详细原因的描述。我学到了很多东西!我曾想过“vector res = {};”是过去C语言的一种很好的初始化写法。为什么在 C++ 中不允许?
【解决方案3】:

您收到此错误是因为您试图访问您从未初始化过的vector&lt;int&gt; res 的索引i。在这一行:

res[i] = product;

为此,您必须了解 Vector 的工作原理,Vector 是动态容器,可以根据其使用情况进行收缩和扩展,在您的情况下,您使用默认构造函数对其进行了初始化,该构造函数没有分配任何内存来保存 int。因此,当您尝试访问时,您会得到未定义的行为。

在默认构造向量的情况下。您不能分配给特定索引。但是您可以通过以下方式将数据放入其中:

res.push_back(data);

您可以使用这些构造函数来修复它:

std::vector<int> res(arr.size(), 0); // In second parameter you can pass default values for all the elements in the vector.
std::vector<int> res(arr.size()); //This will simply initialize elements with default constructor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多