代码之家  ›  专栏  ›  技术社区  ›  Erix

为什么我不能通过向函数传递指针来初始化数组?

  •  4
  • Erix  · 技术社区  · 15 年前

    我知道这有一个非常简单的解释,但我已经被一段时间不必使用指针所惯坏了。

    为什么我不能在C++中做这样的事情

    int* b;
    foo(b);
    

    并通过。。。

    void Something::foo(int* a)
    {
      a = new int[4];
    }
    

    调用foo(b)后,b仍然为null。为什么会这样?

    8 回复  |  直到 15 年前
        1
  •  13
  •   Konrad Rudolph    15 年前

    指针被传递给函数 按价值

    1. 您可以使用引用:

      void f(int*& a) {
          a = new int[4];
      }
      
    2. 或者将指针传递给指针(与您的情况相比,out参数不太常见):

      void f(int** pa) {
         *pa = new int[4];
      }
      

      并按如下方式调用函数:

      f(&a);
      

    就我个人而言,我不喜欢这两种风格 输入 ,输出应由返回值处理。到目前为止,我还没有看到一个令人信服的理由来改变C++中的这个规则。因此,我的建议是:使用以下代码。

    int* create_array() {
        return new int[4];
    }
    
        2
  •  6
  •   Tadeusz Kopec for Ukraine yespbs    15 年前

    通过值将参数传递给foo。改为

    foo(int*& a)
    
        3
  •  4
  •   Karl Voigtland    15 年前

    你在传递价值观。

    您需要通过引用传递:

    void Something::foo(int* &a)
    {
      a = new int[4];
    }
    

    也许这样做更清楚:

    int* Something::foo()
    {
      int* a = new int[4];
      return a;
    }
    
    int* b = foo();
    

        4
  •  2
  •   Sinan Ünür    15 年前

    出于同样的原因,不能通过按值传递来初始化整数。

        5
  •  1
  •   Alan    15 年前

    1)

    int* b;
    

    这应该是:

    int* b = NULL;
    

    2)

    如果将指针传递给指针,则函数应该能够分配内存:

    int* b = NULL;
    Something::foo(&b);
    
    void Something::foo(int** a)
    {
        *a = new int[4];
    }
    
        6
  •  1
  •   Goz    15 年前

    指针是一个整数值(32位操作系统是32位整数),它是内存地址。将整数值传递到函数中。通过将值推送到堆栈上进行传递。然后从堆栈中删除该值,并通过在其上分配一些内存来更改该值。然后退出函数并删除堆栈帧。该堆栈帧中的任何值都将被删除,包括新分配的内存地址。

    int* b;
    foo(&b);
    

    void Something::foo(int** a)
    {
      *a = new int[4];
    }
    

    在这里你申报b。它是一个指向内存位置的整数值。您传入该整数值的地址。即指向内存位置的另一个整数值,该整数值包含指向内存位置的整数值。现在在foo函数中 将内存分配给指向另一个内存位置的地址。然后,当您退出函数时,堆栈展开,指向指针的指针消失。但是,原始整数值(即指针)仍然保留您刚刚通过调用new创建的值。

        7
  •  0
  •   Ken Keenan    15 年前

    您必须使用引用或执行以下操作:

    int* b;
    foo(b);
    
    void Something::foo(int** a)
    {
      *a = new int[4];
    }
    

    (这是老派的C方式,我认为参考更好)

        8
  •  0
  •   DanDan    15 年前

    因为您正在向函数传递NULL。您需要的是(指针到指针):

    int* b;
    foo(b);
    
    void Something::foo(int** a)
    {
      *a = new int[4];
    }