【问题标题】:C++ Size of Array [duplicate]数组的 C++ 大小 [重复]
【发布时间】:2012-03-01 02:35:57
【问题描述】:

可能重复:
Sizeof array passed as parameter

我对 c++ 中的这个 sizeof 运算符很愚蠢,你知道为什么它是 4 和 12 吗?

 void function (int arg[]) {
        cout<<sizeof(arg)<<endl; // 4
    }

    int main ()
    {
        int array[] = {1, 2, 3};
        cout<<sizeof array<<endl; // 12
        function (array);
       return 0;
    }

【问题讨论】:

标签: c++ arrays sizeof


【解决方案1】:

main 中,名称array 是一个数组,因此您可以使用sizeof 获得数组的大小(以字节为单位)。但是,数组在传递给函数时会衰减为指针,因此您会在函数内部得到sizeof(int*)

请注意,以T arg[] 形式获取参数完全与以T* arg 形式获取参数相同。所以你的功能完全等同于

void function(int* arg) {
    cout << sizeof(arg) << endl;
}

【讨论】:

    【解决方案2】:
     void function (int arg[]) // or void function (int arg[N])
    

    等价于

     void function (int *arg)
    

    因此,

    sizeof(arg) == sizeof(int*)
    

    如果你打算传递数组本身,那么 C++ 提供你通过引用传递它:

    void function (int (&arg)[3])
                  //   ^^^ pass by reference
    

    现在,

    sizeof(arg) == sizeof(int[3])
    

    【讨论】:

      【解决方案3】:

      您的下面的程序与下一个类似。

      void function (int arg[]) {
          cout<<sizeof(arg)<<endl; // 4
      }
      

      下面的程序打印指针的大小。

      void function (int *arg) {
          cout<<sizeof(arg)<<endl; // 4
      }
      

      【讨论】:

        【解决方案4】:

        数组只是指向任意数量内存的指针。如果您执行 sizeof(array) ,它将返回指针的大小 - 在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节(如果程序编译为 64 位)。

        这与您必须在 c/c++ 中以空值终止字符串的原因相同 - 以表示数组的结尾。

        简单地说,您可以自己跟踪数组的大小。如果分配一个 40 字节的数组,则必须确保永远不会访问第 40 个索引以上的数组(即数组 [39])。

        希望这会有所帮助。

        【讨论】:

        • 如果数组只是简单的指针,那main里面怎么会打印12?
        • 我不能 100% 确定,但我的猜测是因为您的数组是静态的。与动态内存不同,它的大小在编译时确定。 Sizeof() 可能适用于静态数组,但我可以向您保证,它不适用于在运行时动态分配的数组。
        • 数组不仅仅是指针。
        • @xaxxon 是的,当涉及到它时,它们就是。数组是指向包含指定数据类型序列的内存区域的指针。
        • @Gogeta70 数组是一种语言结构,它不同于指针,其行为也不同于指针。指针也是一种语言结构。两者都可能包含一个内存地址,但两者都不是“简单的”另一个,并且在语言中都有独特的行为。
        猜你喜欢
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        相关资源
        最近更新 更多