无法使用指针添加数组元素
Posted
技术标签:
【中文标题】无法使用指针添加数组元素【英文标题】:Cannot add elements of arrays using pointers 【发布时间】:2021-03-26 19:13:31 【问题描述】:我正在尝试添加两个数组的元素并将它们存储在第三个数组中。我正在试验指针,所以我想将它们用作用户定义函数的参数。 当我运行代码时,只要输入数组的前两个值,就会得到错误:exited,segmentation fault。 我痛苦地不知道自己做错了什么。
#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;
【问题讨论】:
不要使用数组。请改用std::vector
。
您正在尝试存储值而不为其分配内存。就在您的 cin>>*ptX[i];
之前写 ptX[i]=&X[i];
ex ptA[i]=&A[i];
。还可以使用另一个循环来设置ptC[i]=&C[i]
。但这一切都是多余的,你可以直接使用指向数组的指针。
“只要我输入数组的前两个值”——这为您提供了一种减少 minimal reproducible example 的方法。由于您永远不会到达cout<<"\nEnter Array B: \n"
行,因此请删除它以及直到main
函数末尾的所有后续行。然后删除现在未使用的声明和定义。您将有一个更集中的问题,更少的红鲱鱼。
【参考方案1】:
对于初学者来说,这些指针数组
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
的元素进行序列化。数组ptC
仍未初始化。所以这个说法
cout<<"\nElement C["<< i <<"] = "<<*ptC[i];
将再次调用未定义的行为。
因此您需要初始化指针数组。
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 );
【讨论】:
以上是关于无法使用指针添加数组元素的主要内容,如果未能解决你的问题,请参考以下文章