传递值时更改整数数组的大小

时间:2013-06-06 23:09:11

标签: c++ arrays

我只是好奇出现以下错误的原因:我试图确定整数数组的大小。

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

 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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

这里有两种特殊情况语言规则,都直接从C继承。

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

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

  3. 这些规则(不幸的是恕我直言)共同使出现你按值传递一个数组对象,并访问你函数内的一个数组,但事实上它只是指针。

答案 3 :(得分:0)

如果您真的想:

,可以使用模板化成员函数执行此操作
    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(...)使用迭代器。