0

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

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

 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];
}
4

4 回答 4

6

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

于 2013-06-06T23:12:40.970 回答
2

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

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

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

于 2013-06-06T23:13:08.343 回答
1

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

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

  2. 定义为的参数some_type foo[]“调整”为some_type *foo,因此您的参数program实际上是指针,而不是数组。(此调整适用于参数声明。)

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

于 2013-06-06T23:21:49.580 回答
0

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

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

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

于 2013-06-06T23:26:38.847 回答