【问题标题】:Why do sizeof statsements produce different results? [duplicate]为什么 sizeof statsements 会产生不同的结果? [复制]
【发布时间】:2012-07-07 15:33:32
【问题描述】:

可能重复:
Calculating size of an array
Sizeof an array in the C programming language?

为什么sizeof(arr)/(double)sizeof(arr[0]) 有效而sizeof(arr+0)/(double)sizeof(arr[0]) 无效?

为什么sizeof(arr)/(double)sizeof(arr[0]) 在将 arr 传递给函数时也不起作用?这是完整的代码示例:

#include <iostream>

using namespace std;

int givesize(int arr[])
{
   cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
}

int main()
{
   int arr[] = {1,2,3,4,5};
   cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
   cout<<sizeof(arr+2)/(double)sizeof(arr[0])<<"\n";
   givesize(arr);
   return 0;
}

输出 5 1 1

【问题讨论】:

标签: c++


【解决方案1】:

这是因为arrays decay to pointers 当它们被传递给以指针作为参数的函数时。

在您的main 中,

int arr[] = {1,2,3,4,5};

声明等价于

int arr[5] = {1,2,3,4,5};

因为编译器有足够的信息来计算聚合初始化器中的5。然而,在函数头中,int arr[] 并不意味着同样的事情:它周围没有上下文告诉编译器它只是一个指向整数的指针。

【讨论】:

  • arr+2 也会发生同样的事情。
  • 不只是任何函数,只有带指针的函数。
  • @BenjaminLindley 这是一个很好的观点,非常感谢!
  • 致 OP:然后以防你对为什么同样不适用于 sizeof 感到困惑(就像我本周早些时候所说的那样),这个可能在以后有用:stackoverflow.com/questions/11283361/…跨度>
【解决方案2】:

函数参数列表中的int arr[]int* arr 相同。这意味着在:

int givesize(int arr[])
{
   cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
}

sizeof(arr)/(double)sizeof(arr[0]) 实际上是sizeof(int*) / (double)sizeof(int)。因为它输出 1,这意味着 32 位平台。

int arr[] 作为局部变量与int* arr 不同,因此sizeof(arr)/(double)sizeof(arr[0]) 与计算结果为5 的sizeof(int[5]) / (double)sizeof(int) 相同。

接下来,sizeof(arr+2)/(double)sizeof(arr[0]) 再次与sizeof(int*) / (double)sizeof(int) 相同,因为表达式arr+2 的类型是int*

【讨论】:

    【解决方案3】:

    在 main 内部,arr 的类型为“五个整数的数组”,但 arr+0 的类型为“指向 int 的指针”。当你将零添加到 arr 时,你把它当作一个指针,一旦你像指针一样使用数组,它就会被转换为指针。

    【讨论】:

      【解决方案4】:

      为什么 sizeof(arr)/(double)sizeof(arr[0]) 有效

      因为sizeof(arr) 以字节为单位返回整个数组的大小(假设int 为32 位,假设为20),而sizeof(arr[0]) 返回第一个int 的大小(即4 字节)。这将给我们 5 个。

      为什么将 arr 传递给函数时 sizeof(arr)/(double)sizeof(arr[0]) 也不起作用?

      因为数组衰减为指针。这意味着它们丢失了一个重要信息:它们的大小。我们不能仅通过指针直接计算数组的大小。函数怎么会知道它是一个数组开头?


      C++?使用模板函数:

      template <typename T, int N>
      int getsize(const T (&arr)[N])
      {
          return N;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-05
        • 2018-12-30
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多