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

将bool数组传递给函数

  •  3
  • g4ur4v  · 技术社区  · 11 年前

    我将一个bool数组传递给函数,并对函数内部传递的数组进行一些修改,我在函数中所做的更改反映在我传递给函数的原始数组中。例如,在下面的代码中,输出是 1 。为什么我要得到这个输出?例如,当我们传递一个整数变量时,局部变量会保持其局部值。如何在下面的代码中本地保留原始bool数组的局部副本。

    #include<iostream>
    using namespace std;
    void fun(bool A[30])
    {
        A[0]=true;
    }
    int main()
    {
        bool used[3];
        used[0]=used[1]=used[2]=0;
        fun(used);
        cout<<used[0];
    }
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   Community dbr    7 年前

    为什么我要得到这个输出?

    当“按值”传递数组时,数组本身不会被复制,只有指向其地址的指针的副本被传递给被调用者(放置在堆栈上)。无论是否将参数声明为 bool[] bool* , 它衰变为指针 。因此,您仍然可以在被调用的函数中修改数组的内容。

    如何在本地保留原始布尔数组的本地副本?

    你可以使用 std::array 或者,您可以通过将数组包装在结构或类中来解决此问题,因为默认的复制运算符将复制数组:

    struct Array_by_val
    {
      bool my_array[30];
    };
    
    void func (Array_by_val x) {}
    
    int main() {
       Array_by_val x;
       func(x);
    }
    

    引用C99标准中的6.3.2.1p3:

    除非它是sizeof运算符或一元& 运算符,或者是用于初始化数组的字符串文字 类型为“array of type”的表达式转换为表达式 带有类型“pointer to type”,该类型指向 数组对象,并且不是左值。如果数组对象有寄存器 存储类,行为是未定义的。

    C11标准中的相同段落基本相同,添加了新的 _Alignof 操作人员

    请参见此处:

    Why can't arrays be passed as function arguments?

        2
  •  0
  •   Community dbr    7 年前

    当您将数组传递给函数时,实际上您将指针传递给第一个元素。这就是为什么在函数中对数组所做的更改会反映在原始数组中。不能按值传递数组。这是因为:

    复制数组有点复杂,而且不太清楚,因为 对于不同的参数和 函数声明。

    Why can't we pass arrays to function by value?