C++将一个新数组传递给函数中的指针
C++ Passing an new array to a pointer from a function
EDIT:如果我试图在没有全局或静态以及没有向量o动态向量的情况下进行编辑,该怎么办?
我试图创建两个向量,并用一个函数传递一个新的向量,这个向量是两个数组中每个元素的商。即V1为1 1 2 2 3 4 V2为2 2 1 1 2预期的结果是2 2 2 6 8
我的问题是,当我从"quoziente"函数发送"r"结果时,因为我收到了随机数。我认为问题在于,函数只在执行过程中存在,但当它停止运行时,它也会随着变量而消亡。我该怎么办?我确信我把正确的地址传给了"ris"。我甚至试着打印出操作的元素,我确信我做的操作是正确的。非常感谢您的帮助!感谢
这是代码:
1 #include <iostream>
2 using namespace std;
3
4
5
6 void readarray (int* v, int dim) {
7 for(int i=0; i<dim; i++) {
8 cin >> v[i];
9 }
10 }
11
12 void printarray(int* v, int dim) {
13 for(int i=0; i<dim; i++) {
14 cout << v[i] << " ";
15 }
16 cout << endl;
17 }
18
19 int main() {
20 int v1[7];
21 int v2[7];
22 int *ris;
23
24 cout << "V1";
25 readarray(v1,7);
26 cout << "V2";
27 readarray(v2,7);
28 ris = quoziente(v1,v2,7);
29 cout << "V1";
30 printarray(v1,7);
31 cout << "V2";
32 printarray(v2,7);
33 cout << "ris ";
34 printarray(ris,7);
35
36 return 0;
37 }
38
39 int* quoziente (int* v1, int* v2, int dim) {
40 int r[7];
41
42 for(int i=0; i<dim; i++) {
43 r[i] = v1[i] * v2[i];
44 cout << r[i] << " ";
45 }
46 cout << endl;
47 return r;
48 }
如果使用std::vector或其他类似容器,这将更容易管理。
std::vector<int> quotient (std::vector<int> left, std::vector<int> right)
{
std::vector<int> result;
auto left_iterator = left.begin();
auto left_end = left.end();
auto right_iterator = right.begin();
auto right_end = right.end();
for(; left_iterator != left_end && right_iterator != right_end;
left_iterator++, right_iterator++)
{
int quotient = (*left_iterator) * (*right_iterator);
result.push_back(quotient);
std::cout << quotient << " ";
}
std::cout << std::endl;
return result;
}
当然,如前所述,还有std::算法实用程序也更适合于此,例如std::transform
——请参阅P0W的答案。然而,我猜这是为了你自己学习,所以研究std库容器在一般情况下是如何工作的也很重要。
你是对的,因为r是在堆栈上声明的,当它超出范围时,它将被删除。您需要在堆上分配内存,例如
int *r = new int[7]; // * was missing
确保在使用完delete [] ris;
后调用它,以释放分配给的内存
在函数quoziente()内部,
int r[7]<--这是在堆栈上分配的,所以当函数返回时它就死了。
解决问题的替代方法:-
1) 在quozinete()中动态分配r。
int *r = new int [7];
2) 将r声明为静态。
static int r[7];
3) 将r放在全局范围内。
4) 将r与v1和v2一起声明为:-
int v1[7];
int v2[7];
int r[7];
并将quozinete的原型更改为:-
void quoziente (int* v1, int* v2, int dim, int *r)
即将结果数组的指针作为另一个参数传递给函数。
例如,使r
看起来像这样:
int *r = new int[7];
但您必须稍后将其删除。
或者使其成为静态
static int r[7];
并且您不必删除。但它与所有函数调用共享,因此您可能不会调用它两次,保留指针并期望结果保持不变。
您可能已经通过其他人回答解决了问题
我将向您展示另一种使用STL算法实现相同功能的方法
std::transform和lambda函数
int v1[7];
int v2[7];
int ris[7];
std::transform(std::begin(v1), std::end(v1),
std::begin(v2),
std::begin(ris),
[](const int &x, const int &y){ return x*y;}
);
查看演示
正如您在函数中定义的其他答案数组中解释的原因是tempary。它一直存在到功能存在。解决这个问题的不同方法是定义一个名为ris
的数组,而不是指针,其大小与其他两个数组v1和v2相同。将其作为参数传递给函数,并将函数更改为
void quoziente (int* r, int* v1, int* v2, int dim) {
for(int i=0; i<dim; i++) {
r[i] = v1[i] * v2[i];
cout << r[i] << " ";
}
}
调用函数quoziente
时将res作为参数传递
quoziente(ris,v1,v2,7)
第二个解决方案是使用新操作符动态分配数组,正如其他答案中已经解释的那样。但请记住,当数组在主函数中不使用时,请将其删除。这不是推荐的做法,因为如果您不能访问函数代码,就无法知道我们必须删除main()函数中的数组。即使你可以访问该功能,你通常也会忘记删除它。
也不建议使用声明变量/数组为静态的第三种解决方案,因为如果您为不同的数组分配重用该函数,则先前分配的数组也会更改。
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针