函数的 int* 参数中的数据未返回调用者
Data in int* argument of function not returned caller
在 WSL2 上用 g++ 编译,
的样本输出
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using std::vector;
vector <int> powers_2(const int npow) {
vector <int> v;
int j = 2;
for (int i=0; i<npow; i++) {
v.push_back(j);
j*= 2;
}
return v;
}
void pow_2(const int npow, int *v, int *nv) {
vector <int> w = powers_2(npow);
*nv = w.size();
v = (int*)malloc(*nv * sizeof(int));
for (int i=0; i<*nv; i++) {
v[i] = w[i];
printf("%d %d %d\n",i,v[i],w[i]);
}
}
int main() {
int *y;
int ny;
pow_2(3,y,&ny);
printf("\n in main\n");
for (int i=0; i<ny; i++) {
printf("%d %d\n",i,y[i]);
}
}
是
0 2 2
1 4 4
2 8 8
in main
0 1
1 0
2 1091723517
所以在pow_2中设置了参数int* v
,但是数据没有返回给调用者。为什么?
传递函数参数有区别by value, by pointer and by reference。
行
pow_2(3,y,&ny);
会将y
的值传递给函数pow_2
,也就是说会对变量y
的值进行复制,作为本地存在函数 pow_2
中的变量 v
。这不是你想要的,因为在函数 pow_2
中改变变量 v
只会改变那个变量,而不会改变函数中原始变量 y
的值main
.
您想要的是将变量 y
本身传递给函数 pow_2
,而不是它的值,以便函数 pow_2
可以更改它。有两种方法可以做到这一点。您可以传递变量 y
- 作为参考,或
- 作为指针
函数 pow_2
.
要使函数 pow_2
引用 int *
而不是 int *
的值,您可以更改行
void pow_2(const int npow, int *v, int *nv) {
至:
void pow_2(const int npow, int * &v, int *nv) {
或者,您可以使函数 pow_2
使用指向 int *
的指针而不是 int *
的值。您可以更改行
void pow_2(const int npow, int *v, int *nv) {
到
void pow_2(const int npow, int **v, int *nv) {
但是,这将需要您重写函数 pow_2
以便指针在使用时被引用:
void pow_2(const int npow, int **v, int *nv) {
vector <int> w = powers_2(npow);
*nv = w.size();
*v = (int*)malloc(*nv * sizeof(int));
for (int i=0; i<*nv; i++) {
(*v)[i] = w[i];
printf("%d %d %d\n",i,(*v)[i],w[i]);
}
}
此外,您必须以不同方式调用该函数。您将不得不更改行
pow_2(3,y,&ny);
至:
pow_2(3,&y,&ny);
因此,将变量作为引用传递比将其作为指针传递更容易。
在 WSL2 上用 g++ 编译,
的样本输出#include <stdlib.h>
#include <stdio.h>
#include <vector>
using std::vector;
vector <int> powers_2(const int npow) {
vector <int> v;
int j = 2;
for (int i=0; i<npow; i++) {
v.push_back(j);
j*= 2;
}
return v;
}
void pow_2(const int npow, int *v, int *nv) {
vector <int> w = powers_2(npow);
*nv = w.size();
v = (int*)malloc(*nv * sizeof(int));
for (int i=0; i<*nv; i++) {
v[i] = w[i];
printf("%d %d %d\n",i,v[i],w[i]);
}
}
int main() {
int *y;
int ny;
pow_2(3,y,&ny);
printf("\n in main\n");
for (int i=0; i<ny; i++) {
printf("%d %d\n",i,y[i]);
}
}
是
0 2 2
1 4 4
2 8 8
in main
0 1
1 0
2 1091723517
所以在pow_2中设置了参数int* v
,但是数据没有返回给调用者。为什么?
传递函数参数有区别by value, by pointer and by reference。
行
pow_2(3,y,&ny);
会将y
的值传递给函数pow_2
,也就是说会对变量y
的值进行复制,作为本地存在函数 pow_2
中的变量 v
。这不是你想要的,因为在函数 pow_2
中改变变量 v
只会改变那个变量,而不会改变函数中原始变量 y
的值main
.
您想要的是将变量 y
本身传递给函数 pow_2
,而不是它的值,以便函数 pow_2
可以更改它。有两种方法可以做到这一点。您可以传递变量 y
- 作为参考,或
- 作为指针
函数 pow_2
.
要使函数 pow_2
引用 int *
而不是 int *
的值,您可以更改行
void pow_2(const int npow, int *v, int *nv) {
至:
void pow_2(const int npow, int * &v, int *nv) {
或者,您可以使函数 pow_2
使用指向 int *
的指针而不是 int *
的值。您可以更改行
void pow_2(const int npow, int *v, int *nv) {
到
void pow_2(const int npow, int **v, int *nv) {
但是,这将需要您重写函数 pow_2
以便指针在使用时被引用:
void pow_2(const int npow, int **v, int *nv) {
vector <int> w = powers_2(npow);
*nv = w.size();
*v = (int*)malloc(*nv * sizeof(int));
for (int i=0; i<*nv; i++) {
(*v)[i] = w[i];
printf("%d %d %d\n",i,(*v)[i],w[i]);
}
}
此外,您必须以不同方式调用该函数。您将不得不更改行
pow_2(3,y,&ny);
至:
pow_2(3,&y,&ny);
因此,将变量作为引用传递比将其作为指针传递更容易。