主要功能之外的新运算符-C ++

时间:2018-10-11 23:19:07

标签: c++ pointers new-operator

为什么此代码有效:

 //Things
 int **A;

 main(){

    //things
    A = new int*[n];
    for (int i = 0; i < n; i++) {
        A[i] = new int[m];
        }
   // things
}

此代码不起作用:

//Things
int **A;

void functionOutsideMain(int **A,int n, int m){
    A = new int*[n];
    for (int i = 0; i < n; i++) {
        A[i] = new int[m];
        }
    }

main(){

//Things
functionOutsideMain(A,n,m);
//Things
}

当我在主要功能之外的单独功能中使用 new 运算符时,它将无法正常工作。

但是,如果我在主函数内使用 new 运算符,它将起作用。

您能解释一下为什么会这样吗?

如果我做错了事。

2 个答案:

答案 0 :(得分:1)

在第一个示例中,A只是main()直接使用的全局变量。

在第二个示例中,functionOutsideMain()拥有自己的A参数,而main()仍使用全局A变量。

functionOutsideMain()使用其A参数按值。当main()传递全局AfunctionOutsideMain()时,将复制该A副本,因此,将{{1 }}为其functionOutsideMain()参数赋值将不会应用于全局A变量,这就是A看不到更改的原因。

要执行您要尝试的操作,您需要main()引用其functionOutsideMain()参数作为参考

A

现在,void functionOutsideMain(int** &A, int n, int m) 分配给其functionOutsideMain()参数的任何值都将分配给全局A变量,因此将由A看到。

答案 1 :(得分:0)

嘿,我不理解您的意思是不工作,但是可能的解决方案可能是

  • 因为A已经是全局的,所以无需再次将A传递给functionOutsideMain

  • 当您将A传递给functionOutsideMain时,实际参数A成为形式参数A,这就是问题所在,在C中仅按值传递(与C ++中的按引用传递不同)。因此,当您将A传递给函数时,会在函数中创建一个新的指针,并且当您为其分配一块内存时,新指针指向该内存,而不是您在主函数中使用的旧指针。 />

一个可能的解决方案是

void function_outside_main(int ***A, int n, int m) {
    int **Aptr = (*A);
    // And then use Aptr to allocate memory as you did
}


否则不要将A作为函数参数传递,因为它是全局变量