【问题标题】:Changing of the size of integer array when passing by value [duplicate]按值传递时更改整数数组的大小[重复]
【发布时间】:2013-06-06 23:09:11
【问题描述】:

我只是好奇以下错误的原因是什么:我正在尝试确定整数数组的大小。

当我在主函数中找到数组的大小时,此代码正确返回:

 int program[12] = { 1007, 1008, 2007, 3008, 2109, 1109, 4300, 0, 0, 0, -99999 };
 cout<<sizeof(program)/sizeof(program[0])<<"\n";

但是如果我将程序按值传递给函数,它总是返回 2:

void Sipmletron::load(int program[])
{
    int length=sizeof(program)/sizeof(program[0])
    std::cout<<length<<"\n";
    memory= new int[length];
}

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    您不能按值传递数组。该参数作为指向数组第一个元素的指针传递,因此您实际上是在计算 sizeof(int*) / sizeof(int)

    【讨论】:

    • +1:虽然我同意你的回答,但指针和 int 的大小不一样吗?所以我的想法是长度是 1 而不是 2?
    • 值得一提的是,值 2 表示指针是 OP 平台上整数大小的两倍,对于 int * 可能是 64 位 (8),对于 int 可能是 32 位 (4)。
    • @Calpis:我们大概可以猜到编译器使用的目标是 64 位环境。但如果我没记错的话,理论上int 也有可能只有 16 位。
    • 啊好吧不知道。感谢您的澄清。
    • 没错,操作系统是64位的。感谢您的澄清!
    【解决方案2】:

    当一个数组在 C++(和 C)中传递时,它会失去它的大小(它作为第一个元素的地址传递,无论它是 int * 还是 int [])。

    如果你使用的是 C++11,你可以使用 std::array,它有一个 size() 成员函数,类似于向量。在几乎所有其他方面,它与标准 C 样式数组相同。

    否则,您必须将大小与数组一起传递 - 或使用一些标记来指示结束(看起来您已经有了 -99999)。

    【讨论】:

    • 因此这里有“几乎”这个词...
    • 哦,原来如此。那么对不起:)
    【解决方案3】:

    这里有两个特殊情况的语言规则,它们都直接继承自 C。

    1. 在大多数情况下,数组类型的表达式被隐式转换为(“衰减到”)指向数组第一个元素的指针。 C 中的例外情况是表达式是一元 &amp;sizeof 的操作数,或者是用于初始化数组(子)对象的初始化程序中的字符串文字。 C++ 有更多例外,但没有一个适用于此。

    2. 定义为some_type foo[] 的参数被“调整”为some_type *foo,因此您的参数program 实际上是一个指针,而不是一个数组。 (此调整发生在参数声明中。)

    这些规则(不幸的是,恕我直言)共同作用,看起来您正在按值传递一个数组对象,并在您的函数内部访问一个数组,但实际上它都是指针。 p>

    【讨论】:

      【解决方案4】:

      如果您真的想这样做,您可以使用模板化的成员函数:

          template <size_t N>
          void Sipmletron::load(int (&program)[N])
          {
            size_t length = N;
            std::cout << length << "\n";
            memory = new int[length];
          }
      

      此外,即使没有看到您的其余代码,我相信使用std::vector 而不是使用new 进行自己的内存管理是值得的load(...) 使用了迭代器。

      【讨论】:

        猜你喜欢
        • 2014-10-27
        • 1970-01-01
        • 2021-08-05
        • 2023-03-06
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2015-04-24
        相关资源
        最近更新 更多