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