【问题标题】:Different sizeof results不同大小的结果
【发布时间】:2010-09-08 02:55:42
【问题描述】:

为什么n在下面的函数中不等于8

void foo(char cvalue[8])
{
  int n = sizeof (cvalue);
}

但是n 确实在这个版本的函数中等于8

void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}

【问题讨论】:

    标签: c++ c sizeof


    【解决方案1】:

    因为您不能将整个数组作为 C 中的函数参数传递。您实际上是在传递一个指向它的指针;括号是语法糖。无法保证您指向的数组大小为 8,因为您可以向此函数传递您想要的任何字符指针。

    // These all do the same thing
    void foo(char cvalue[8])
    void foo(char cvalue[])
    void foo(char *cvalue)
    

    【讨论】:

      【解决方案2】:

      C 和 C++ 数组不是一流的对象;你不能将数组传递给函数,它们总是衰减为指针。

      但是,您可以将指针和引用传递给数组。这可以防止数组边界衰减。所以这是合法的:

      template<typename T, size_t N>
      void foo(const T(&arr)[N])
      {
          int n = sizeof(arr);
      }
      

      【讨论】:

      • 您的聪明解决方案值得更多升级。
      • 只需要注意模板示例是C++,不是C。C不支持引用类型。
      【解决方案3】:

      在第一个示例中,作为传递参数的 cvalue 实际上只是一个指向字符数组的指针,当您获取它的 sizeof() 时,您会得到指针的大小。在第二种情况下,您已将其声明为局部变量,您将获得整个数组的大小。

      【讨论】:

        【解决方案4】:

        参数的大小在 32 位系统上为 4,而在使用 -m64 编译的 64 位系统上为 8。这是因为数组在函数中作为指针传递。指针只是一个内存地址。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-23
          • 1970-01-01
          • 1970-01-01
          • 2016-03-17
          • 2010-12-17
          • 1970-01-01
          • 2019-08-15
          • 1970-01-01
          相关资源
          最近更新 更多