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
一个实际大小。因此,由于向量不包含任何元素,任何 i
的 res[i]
将具有未定义的行为。考虑使用res.push_back(product);
而不是res[i] = product;
,但请确保您在j 循环外部 执行此操作,而不是像您现在所做的那样在其中执行此操作——还要注意n == 1
的特殊情况将中断调用者,因为这也返回一个空向量,但调用者假定它有 1 个元素。
如果您不知道向量的大小,可以使用 push_back 等方法将数据插入到向量中,它会根据需要自动调整大小。
谢谢大家,非常感谢!
【参考方案1】:
这是失败的地方:
res[i] = product;
原因是你声明 res 是这样的:
vector<long> res = ;
所以您试图访问位于空向量的“单元”i
的 long
元素...这在 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[i]=product
表示您从向量 res
访问元素。但是您还没有重新分配或向其中插入数据。这就是分段错误的原因。
要解决此问题,请将res
向量的大小调整为arr
的大小,以便该向量具有内存中要访问的元素,
vector<long> arrayOfArrayProducts(const vector<int>& arr)
vector<long> res(srr.size());
...
【讨论】:
感谢详细原因的描述。我学到了很多东西!我曾想过“vector您收到此错误是因为您试图访问您从未初始化过的vector<int> 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
javascript Array.of和Array.from