2012-03-01 100 views
6

可能重复的大小:
Sizeof array passed as parameterC++阵列

我是愚蠢的在C++中sizeof操作符,你有什么想法,为什么它是4和12?

void function (int arg[]) { 
     cout<<sizeof(arg)<<endl; // 4 
    } 

    int main() 
    { 
     int array[] = {1, 2, 3}; 
     cout<<sizeof array<<endl; // 12 
     function (array); 
     return 0; 
    } 
+2

[Sizeof array作为参数传递](http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace 2012-03-01 02:37:44

+0

参见http://stackoverflow.com/questions/1641957/is- array-name-a-pointer-in-c和http://stackoverflow.com/questions/720077/calculating-size-of-an-array - 这是一个FAQ。 – 2012-03-01 02:43:10

回答

23

main,名字array是一个数组,所以你在sizeof数组的字节获得大小。然而,当一个数组传递给一个函数时,数组会衰减到一个指针,所以你在函数内部得到了sizeof(int*)

请注意,以T arg[]的形式参数为,确切地说与将参数作为T* arg相同。所以你的功能是完全等价的

void function(int* arg) { 
    cout << sizeof(arg) << endl; 
} 
0

你的程序在下面是类似的下一个。

void function (int arg[]) { 
    cout<<sizeof(arg)<<endl; // 4 
} 

下面的程序打印指针的大小。

void function (int *arg) { 
    cout<<sizeof(arg)<<endl; // 4 
} 
4
void function (int arg[]) // or void function (int arg[N]) 

相当于

void function (int *arg) 

因此,

sizeof(arg) == sizeof(int*) 

如果打算通过阵列本身,则C++提供你通过引用传递它:

void function (int (&arg)[3]) 
       // ^^^ pass by reference 

现在,

sizeof(arg) == sizeof(int[3]) 
-1

阵列仅仅是用于指向的存储器的任意的量。如果你做sizeof(数组),它将返回一个指针的大小 - 32位系统上有4个字节,64位系统上有8个字节(如果程序编译为64位)。

这与您必须在c/C++中以空值终止您的字符串来表示数组的末尾的原因相同。

简而言之,您可以自己跟踪阵列的大小。如果你分配一个40字节的数组,你必须确保你永远不会访问第40个索引之上的数组(即array [39])。

希望这会有所帮助。

+0

如果数组只是指针,那么如何在main中打印12呢? – fredoverflow 2012-03-01 07:33:13

+0

我不能100%确定,但我的猜测是因为你的数组是静态的。它的大小是在编译时确定的,与动态内存不同。Sizeof()可以在静态数组上工作,但是我可以向你保证它不会在运行时动态分配的数组上工作。 – Gogeta70 2012-03-01 14:08:20

+1

数组不是简单的指针。 – xaxxon 2017-09-09 01:26:48