【问题标题】:How determine Array length [duplicate]如何确定数组长度[重复]
【发布时间】:2017-10-18 09:26:31
【问题描述】:

我正在尝试创建一个确定数组长度的函数。我的代码不起作用,请帮助!

#include <iostream>

using namespace std;

  int ArrayLength(int Array[])
    {
        int i = 0;
        while (Array[i] != NULL)
        {
            i++;
        }
        return i;
    }

int main(void)
{
    int test[5] = { 4,5,6,7,1 };
    int testLen = ArrayLength(test);
    cout << " test length  = " << testLen;

    return 0;
}

【问题讨论】:

  • 数组不是这样工作的。不能保证最后一个元素旁边的元素是 NULL,恰恰相反,它可以是任何东西。
  • 当读取超过数组长度时,值不是0,而是未定义的行为。它可能有任何价值或使程序崩溃。

标签: c++ arrays


【解决方案1】:

数组不是以 NULL 结尾的,因此您不能假设存在等于 NULL 的结束元素。当一个数组被传递给你的函数ArrayLength() 时,它会衰减为指向第一个数组元素的指针,而有关数组大小的所有信息都会丢失。

要以字节为单位获取数组的大小(不是指向其第一个元素的指针),请使用 sizeof() 运算符。

int array[5] = {0,1,2,3,4};
static_assert(sizeof(array) == 5*sizeof(int),"!!");

如果你想让一个函数接受array作为参数并返回它的大小,你可以构造一个模板:

template<typename T, size_t N>
size_t ArrayLength(const T& [N])
{ return N; }

【讨论】:

    【解决方案2】:

    当数组通过值传递时,它被隐式转换为指向其第一个元素的指针。而且数组没有标记值。

    函数可以这样声明

    template <size_t N>
    constexpr size_t ArrayLength(const int(&a)[N])
    {
        return N;
    }
    

    或者喜欢

    template <class T, size_t N>
    constexpr size_t ArrayLength(const T(&a)[N])
    {
        return N;
    }
    

    考虑到在标头&lt;type_traits&gt; 中声明的标准C++ 类std::extent 执行该任务。

    例如

    #include <iostream>
    #include <type_traits>
    
    int main()
    {
        int test[5] = { 4,5,6,7,1 };
    
        std::cout << std::extent<decltype(test)>() << std::endl;
    }
    

    【讨论】:

      【解决方案3】:

      你可以使用这个找到数组的长度

      int testLen = (sizeof(test)/sizeof(*test));
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-22
        • 2013-05-22
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多