为什么数组的大小不一致取决于它在源代码中的位置?

时间:2014-03-12 17:56:23

标签: c++ gcc sizeof

我可以声明animal_array1animal_array2。堆栈中的第一个,而第二个是......好吧,仍然在堆栈上,但这次被声明为函数参数。以下是示例代码:

 #include <iostream>

 using namespace std;

 struct Animal
 {
 };

 void test(Animal animal_array2[10])
 {
     Animal animal_array1[10];
     if(sizeof(animal_array2) == sizeof(animal_array1))
         cout << "Both sizes are equal. That's expected!" << endl;
     else
         cout << "Mhhh sizes are *NOT* equal. That wasn't expected at all!" << endl;

 }

 int main()
 {
     Animal unused_var[10];
     test(unused_var);
 }

输出结果为:

 $./a.out 
 Mhhh sizes are *NOT* equal. That wasn't expected at all!

怎么可能? Gcc bug?或者它是标准行为?我们怎样才能从相同的表观类型得到这样的拉伸结果?

2 个答案:

答案 0 :(得分:4)

数组是C和C ++中唯一不能通过值传递的数据类型。因此,数组衰减为指向数组的第一个元素的指针(当声明并传递时)作为函数参数。

基本上就是这样:

void test(Animal animal_array2[10])

实际上是:

void test(Animal *animal_array2)

仅作为功能参数

并将数组作为参数传递:

test(unused_var);

衰减到指向数组中第一个元素的指针:

test(&(unused_var[0]));

作为旁注:但没有实际解除引用)

答案 1 :(得分:3)

当传递给C ++中的函数时,数组会衰减为指针。通常,您所做的是将已知大小作为单独的参数传递给函数。不在方括号之间。