按值传递时改变整型数组的大小

Changing of the size of integer array when passing by value

本文关键字:数组 整型 改变 按值传递      更新时间:2023-10-16

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

当我在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];
}

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

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

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

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

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

  1. 在大多数上下文中,数组类型的表达式被隐式转换为("衰减为")指向数组第一个元素的指针。在C语言中,当表达式是一元&sizeof的操作数时,或者当它是用于初始化数组(子)对象的初始化器中的字符串字面值时,就会出现异常。c++有更多的异常,但没有一个适用于这里。

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

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

如果需要的话,可以使用模板化的成员函数:

    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(...)使用迭代器。