无法使用指针添加数组的元素



我正在尝试添加两个数组的元素,并将它们存储在第三个数组中。我正在试验指针,所以我想把它们用作用户定义函数的参数。当我运行代码时,只要我输入数组的前两个值,就会得到错误:已退出,分段错误。我痛苦地没有意识到自己做错了什么。

#include<iostream>
using namespace std;
float addarrays(float ptra1[5], float ptra2[5], float ptra3[5])
{
for(int i=0; i<5; i++)
{
ptra3[i] = ptra1[i] + ptra2[i];
}
return *ptra3;
}
int main()
{
float A[5], B[5], C[5];
float *ptA[5], *ptB[5], *ptC[5];

cout<<"Enter Array A: n";
for(int i=0; i<5; i++)
{
cout<<"Element A["<< i <<"] = ";
cin>>*ptA[i];
}

cout<<"nEnter Array B: n";
for(int i=0; i<5; i++)
{
cout<<"Element B["<< i <<"] = ";
cin>>*ptB[i];
}

addarrays(*ptA, *ptB, *ptC);
cout<<"Displaying result for C[i] = A[i] + B[i]: n";
for(int i=0; i<5; i++)
{
cout<<"nElement C["<< i <<"] = "<<*ptC[i];
}
return 0;
}

对于初学者来说,这些指针数组

float *ptA[5], *ptB[5], *ptC[5];

未初始化。

所以这个声明

cin>>*ptA[i];

调用未定义的行为。

例如,您可以在类似的循环中设置数组ptA的元素

size_t i = 0;
for ( auto &p : ptA ) p = A + i++;

注意,函数addarrays不设置数组ptC的元素。事实上,只要数组ptC被正确初始化,它就试图对数组C的元素进行ser。阵列ptC仍未初始化。所以这个声明

cout<<"nElement C["<< i <<"] = "<<*ptC[i];

再次调用未定义的bejavior。

因此,您需要初始化指针数组。

size_t i = 0;
for ( auto &p :ptA ) p = A + i++;
i = 0;
for ( auto &p :ptB ) p = B + i++;
i = 0;
for ( auto &p :ptC ) p = C + i++;

功能可以通过以下方式声明和定义

void addarrays(float * ptra1[], float * ptra2[], float * ptra3[], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
*ptra3[i] = *ptra1[i] + *ptra2[i];
}
}

像一样被称为

addarrays( ptA, ptB, ptC, 5 );

最新更新