【问题标题】:How do i handle this situation C++ sizeof problem [duplicate]我该如何处理这种情况 C++ sizeof 问题 [重复]
【发布时间】:2020-04-05 19:20:36
【问题描述】:
void f(int* b[])
{
    cout << sizeof(*b) << endl;
}

int main()
{
    int x[4] = {1, 2, 3, 4};
    int* a[] = {&x[0], &x[1], &x[2], &x[3]};

    cout << sizeof(a) << endl;

    f(a);
}

程序首先输出32(在main) 和 8(在函数中)

我该如何处理这种情况?

【问题讨论】:

  • 您还必须将数组的大小传递给您的函数。
  • 指针的大小是指针本身的大小,而不是它可能指向的大小(因为编译器并不真正知道它可能指向什么)。
  • 另外,如果你想真正比较苹果和苹果,在f 你应该做sizeof(b) 而不是sizeof(b[0])(这就是sizeof(*b) 的真正含义)。并不是说它会改变任何东西,因为b 也是一个指针。
  • 参数类型int* b[]等价于int** b,而a的类型不是int*[],而是int*[4]

标签: c++ arrays c++11 sizeof implicit-conversion


【解决方案1】:

如果我理解正确,您正在尝试获取函数中传递的数组的大小。

按照以下方式进行

template <size_t N>
void f( int* ( &b )[N] )
{
    cout << sizeof( b ) << endl;
}

在 C 语言中,您应该使用另外一个参数来声明函数,例如

void f(int* b[], size_t n )
{
    printf( "%zu\n", n * sizeof( *b ) );
}

然后这样称呼它

f(a, sizeof( a ) / sizeof( *a ) );

您也可以在 C++ 中使用这种方法。

【讨论】:

  • 最好将大小参数放在 C 中的数组指针之前,因为这允许您使用它们来声明指向数组的指针:smoothImage(int width, int height, Pixel image[height][width]) 或者等效地,以编译器理解的方式声明指针: smoothImage(int width, int height, Pixel (*image)[width])
  • @cmaster 没有变长数组。所以你的建议在这种情况下没有男性意义。
  • 有。在 C 中。自 C99 以来。不是在 C++ 中,在这方面该语言远不如 C99。
【解决方案2】:

您可以通过使用 size_t 类型传递数组中的元素数量来处理这种情况。

一旦数组被传递给一个函数,它衰减到一个指向第一个元素的指针。所有尺寸信息都会丢失。 sizeof 是一个奇怪的运算符,因为指针衰减不适用于它的参数,这解释了输出的差异。

【讨论】:

    【解决方案3】:

    数组衰减为指针。这就是问题的原因。这是您可以解决的方法。通过引用传递数组:

    template <typename T>
    void f(T &b) {
      std::cout << sizeof(b) << std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多