我是愚蠢的在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;
}
我是愚蠢的在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;
}
在main
,名字array
是一个数组,所以你在sizeof
数组的字节获得大小。然而,当一个数组传递给一个函数时,数组会衰减到一个指针,所以你在函数内部得到了sizeof(int*)
。
请注意,以T arg[]
的形式参数为,确切地说与将参数作为T* arg
相同。所以你的功能是完全等价的
void function(int* arg) {
cout << sizeof(arg) << endl;
}
你的程序在下面是类似的下一个。
void function (int arg[]) {
cout<<sizeof(arg)<<endl; // 4
}
下面的程序打印指针的大小。
void function (int *arg) {
cout<<sizeof(arg)<<endl; // 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])
阵列仅仅是用于指向的存储器的任意的量。如果你做sizeof(数组),它将返回一个指针的大小 - 32位系统上有4个字节,64位系统上有8个字节(如果程序编译为64位)。
这与您必须在c/C++中以空值终止您的字符串来表示数组的末尾的原因相同。
简而言之,您可以自己跟踪阵列的大小。如果你分配一个40字节的数组,你必须确保你永远不会访问第40个索引之上的数组(即array [39])。
希望这会有所帮助。
如果数组只是指针,那么如何在main中打印12呢? – fredoverflow 2012-03-01 07:33:13
我不能100%确定,但我的猜测是因为你的数组是静态的。它的大小是在编译时确定的,与动态内存不同。Sizeof()可以在静态数组上工作,但是我可以向你保证它不会在运行时动态分配的数组上工作。 – Gogeta70 2012-03-01 14:08:20
数组不是简单的指针。 – xaxxon 2017-09-09 01:26:48
[Sizeof array作为参数传递](http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) – Blastfurnace 2012-03-01 02:37:44
参见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