函数的 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);

因此,将变量作为引用传递比将其作为指针传递更容易。