C++ Array of Array Products :exited,segmentation fault

Posted

技术标签:

【中文标题】C++ Array of Array Products :exited,segmentation fault【英文标题】:C++ 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> arr8, 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 等方法将数据插入到向量中,它会根据需要自动调整大小。 谢谢大家,非常感谢! 【参考方案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

【讨论】:

以上是关于C++ Array of Array Products :exited,segmentation fault的主要内容,如果未能解决你的问题,请参考以下文章

COM接口 c# marshalling array of arrays

Array.of() && Array()

Array.of将数值转换为数组

javascript Array.of和Array.from

javascript Array.from()和Array.of()

Array.of && Array.from