【问题标题】:Sizeof array passed as parameter of functionSizeof 数组作为函数的参数传递
【发布时间】:2020-07-28 20:13:48
【问题描述】:

让我们考虑以下代码:

#include <iostream>
using namespace std;

void foo(int * arr)
{
    cout << sizeof(arr) << endl;
}

int main()
{
    int arr[3] = {1, 2, 3};
    cout << sizeof(arr) << endl;
    foo(arr);
}

既然数组名衰减为指向其第一个元素的指针,为什么foo() 内部的sizeof(arr) 返回8 而不是4?

【问题讨论】:

  • 因为在您的系统上指针的大小是 8? (这在 64 位平台上很常见)
  • 在 C++ 中,您应该传递 std::vectorstd::array,具体取决于您的用例。否则,在 C API 中,每个数组传递两个参数是规范的:首先是指向数组的指针,其次是元素的数量。
  • @michalt38 请重新阅读您自己写的内容。 “由于数组名称衰减为指向其第一个元素的指针,为什么 foo() 中的 sizeof(arr) 返回 8 而不是 4?”有时理解你在写什么是非常有用的。

标签: c++ arrays pointers parameter-passing sizeof


【解决方案1】:

在大多数情况下,指针的大小是 8 个字节。在你的系统中这是指针的大小。

请注意,指针的大小,您可能知道这一点,并不是它所指向的对象的大小或对象类型的大小。

指针的大小取决于几个因素,例如 CPU 架构、编译器或操作系统。

它通常的工作方式是,如果系统是16位,则大小指针为2字节,如果系统是32位,则大小为4字节,如果是64位,则为8字节。

【讨论】:

    【解决方案2】:

    传递给函数的参数是数组第一个元素的地址。这意味着在函数中您只能看到您在主范围内声明的数组的地址。 如果你想像在主函数中一样对待数组,你应该将它的大小也作为参数传递给函数。如果您的数组始终具有固定大小,那么您不必这样做。 我想补充一点,sizeof(arr) 永远不会返回与主范围一相同的值。

    函数内部sizeof(arr)的结果就是sizeof(int*)的结果

    【讨论】:

      【解决方案3】:

      当您将数组分配给指针并使用sizeof 运算符作为指针时,sizeof 将返回指针的大小(而不是数组)。所以在 foo 函数中,sizeof 返回int * 字节大小。

      另外,您可以使用array 代替内置数组。 array 知道它的大小,但内置数组不会。

      注意:类型大小取决于平台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-23
        • 1970-01-01
        • 2012-12-07
        • 2016-06-12
        • 1970-01-01
        • 2021-08-05
        • 2012-01-17
        相关资源
        最近更新 更多