我只是好奇出现以下错误的原因:我试图确定整数数组的大小。
当我在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];
}
答案 0 :(得分:6)
您无法按值传递数组。该参数作为指向数组第一个元素的指针传递,因此您实际上在计算sizeof(int*) / sizeof(int)
。
答案 1 :(得分:2)
当一个数组在C ++(和C)中传递时,它会丢失它的大小(它作为第一个元素的地址传递,无论它是int *
还是int []
)。
如果您使用的是具有std::array
成员函数的C ++ 11,则可以使用size()
,类似于vector。在几乎所有其他方面,它与标准C样式数组相同。
否则,您必须将大小与数组一起传递 - 或使用一些标记来指示结束(看起来您已经拥有-99999
)。
答案 2 :(得分:1)
这里有两种特殊情况语言规则,都直接从C继承。
在大多数情况下,数组类型的表达式被隐式转换为(“衰减到”)指向数组第一个元素的指针。 C中的例外是表达式是一元&
或sizeof
的操作数,或者它是用于初始化数组(子)对象的初始值设定项中的字符串文字。 C ++有更多的例外,但没有一个适用于此。
定义为some_type foo[]
的参数被“调整”为some_type *foo
,因此您的参数program
实际上是指针,而不是数组。 (对于参数声明,此调整仅发生 。)
这些规则(不幸的是恕我直言)共同使出现你按值传递一个数组对象,并访问你函数内的一个数组,但事实上它只是指针。
答案 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(...)
使用迭代器。