按值传递时改变整型数组的大小
Changing of the size of integer array when passing by value
我只是好奇是什么原因是以下错误:我试图确定一个整数数组的大小。
当我在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语言。
-
在大多数上下文中,数组类型的表达式被隐式转换为("衰减为")指向数组第一个元素的指针。在C语言中,当表达式是一元
&
或sizeof
的操作数时,或者当它是用于初始化数组(子)对象的初始化器中的字符串字面值时,就会出现异常。c++有更多的异常,但没有一个适用于这里。 -
定义为
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(...)
使用迭代器。
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将 BYTE 数组转换为无符号长整型
- 错误:数组大小表达式必须具有整型或无作用域枚举类型,而不是'double'
- 如何将SHA1转换为无符号长整型数组[5]
- 我需要以相反的方式复制一个长整型数组,我需要系统函数,例如 memcpy 有没有
- 如何将字节数组转换为整数类型(整数、长整型、短型等)"安眠安"?
- 复制存储在空指针的整型数组到整型数组
- 如何使用SSE来处理整型数组,使用条件
- 整型转换为字符数组
- 序列化/反序列化整型数组为char数组
- c++将整型数组赋值给大小相同的空整型数组
- c++中,数组的下标需要为整型
- 按值传递时改变整型数组的大小
- 如何将ASCII码数组转换为整型
- 定义长整型长数组
- c++排序(升序,降序)整型数组
- 将字符串转换为整型数组
- 将二进制文件读入整型数组
- 将无符号字符数组转换为整型
- 将数组整型值转换为双精度值