zoukankan      html  css  js  c++  java
  • 数组作为函数形参时应注意的问题

    在利用Google C++ Testing Framework --- gtest编写test case 时,引起了一个”奇怪的“问题:

    1 int digitArray[] = {7, 8, 9};
    2  int size = sizeof digitArray / sizeof digitArray[0];

    将以上代码包含在测试函数TEST()中时,size求取的是正常值。然而在待测函数

    代码
    int FetchLargestNum(int numbers[])
    {
    int max = INT_MIN;
    if(numbers != NULL)
    {
    int length = sizeof numbers / sizeof numbers[0];
    for (int i = 0; i < length; i++)
    {
    if(max < numbers[i])
    max
    = numbers[i];
    }
    }
    else
    {
    throw exception("Illegal Parameters");
    }
    return max;
    }

    中的调用结果length值却始终为1,导致案例一直运行失败:

    TEST(FetchLargestNumTest, Find_Spec_Number)
    {
    int digitArray[] = {7, 8, 9};
    ASSERT_EQ(
    9, FetchLargestNum(digitArray));
    }

    跟踪调试后,我认识到是把数组作为传入参数时产生了问题,最后发现:

    一旦数组出现在函数传入参数时,编译器隐式地生成了一个指向数组的第一个元素的指针。数组实际上并未被传入到函数,它马上退化(Decay)为了指向数组首个元素的指针。这也就造成了在被测试函数的外部和函数内调用 sizeof digitArray 计算结果不一致的情况,在函数内部实际求取的是指针本身的大小,而外部得到的是整个数组的大小。

    ps: 数组形参

    1. 从数组到指针的自动转化被称之为“退化”,即数组退化成指向其首个元素的指针。同样的事情也发生在函数上,一个函数型参数会退化为一个函数指针。然而,不同于数组丢失边界的退化,一个退化的函数指针仍然具有良好的感知能力,可以保持其参数类型和返回类型。

    2. 以数组作为形参产生的问题在于:

    a. 数组的大小必须以形参的方式显示的编码,并以单独的实参传入或在数组内部以一个结束符值作为标识(如字符数组中的 ‘\0’ )。

    b. 不管数组如何声明,一个数组通常是由指向其首个元素的指针进行操作的。

    鉴于以上两点,经常采用某种标准的容器(通常是vector 或是 string)来替代对数组的大多数传统的用法,并且常优先考虑使用标准容器。

  • 相关阅读:
    ASP.NET中备份恢复数据库
    SQL Server连接失败错误小结
    GSL科学计算库的使用
    [转]VC编程中经常能遇到LNK2005错误
    主函数main中变量(int argc,char *argv[])的含义
    毕业了,工作了
    何为COM组件技术
    一个老外总结的WP开发资源
    跟我一起写Makefile
    qsort() 之 __cdecl
  • 原文地址:https://www.cnblogs.com/raywalker/p/1670792.html
Copyright © 2011-2022 走看看