【问题标题】:C++ - why does sizeof return the false value for an array when used as return value in a function [duplicate]C ++ - 为什么sizeof在函数中用作返回值时返回数组的错误值[重复]
【发布时间】:2019-12-14 07:19:15
【问题描述】:

我对数组(int、char 等)的大小有一点问题。首先我需要告诉你,我是 C++ 的初学者,有一些其他编程语言的背景。现在让我们考虑以下程序:

int IntArrayLength(int Array[]){

  return (sizeof(Array) / sizeof(Array[0]));
}

int main(){ 

   int array[] = {10,20,30,40,50};
   cout << (sizeof(array) / sizeof(array[0])) << endl; // returns 5, which is the correct value
   cout << IntArrayLength(array) << endl; // returns 2, no matter how many elements are in the array


}

为什么函数IntArrayLength返回值2,而表达式(sizeof(array) / sizeof(array[0]))返回正确的值,而不是放入函数中。

提前致谢!

【问题讨论】:

  • C++17 有一个功能:std::size
  • 你可能想改用std::array而不是c数组。

标签: c++ arrays int sizeof


【解决方案1】:

编译器将声明为具有数组类型的函数参数调整为指向数组元素类型的指针。

所以这个函数声明

int IntArrayLength(int Array[]);

由编译器调整为以下声明

int IntArrayLength(int *Array);

两者都声明了同一个函数。

您甚至可以将这些声明一起写在程序中,尽管它们是多余的。

int IntArrayLength(int Array[]);
int IntArrayLength(int *Array);

int IntArrayLength(int Array[]){

  return (sizeof(Array) / sizeof(Array[0]));
}

并且传递的数组被转换为指向其第一个元素的指针。

所以在函数中的表达式

(sizeof(Array) / sizeof(Array[0]))

等价于表达式

(sizeof(int *) / sizeof( int))

根据指针和整数的大小,通常产生 1 或 2。

你可以写一个模板函数,比如

template <size_t N>
size_t IntArrayLength( int ( &Array )[N] ){
  return (sizeof(Array) / sizeof(Array[0]));
}

或者只是

template <size_t N>
size_t IntArrayLength( int ( &Array )[N] ){
  return N;
}

如果参数被声明为对数组 abd 的引用,您将得到预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2023-03-30
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多