我在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;
}
答案 0 :(得分:23)
在main
中,名称array
是一个数组,因此您可以使用sizeof
获取数组的字节大小。但是,数组在传递给函数时会衰减到指针,因此在函数内部会得到sizeof(int*)
。
请注意,采用T arg[]
形式的参数正好与将参数作为T* arg
相同。所以你的功能完全等同于
void function(int* arg) {
cout << sizeof(arg) << endl;
}
答案 1 :(得分: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])
答案 2 :(得分:0)
下面的程序与下一个程序类似。
void function (int arg[]) {
cout<<sizeof(arg)<<endl; // 4
}
下面的程序打印指针的大小。
void function (int *arg) {
cout<<sizeof(arg)<<endl; // 4
}
答案 3 :(得分:-1)
数组只是指向任意数量内存的指针。如果你执行sizeof(数组),它将返回一个指针的大小 - 在32位系统上为4个字节,在64位系统上为8个字节(如果程序编译为64位)。
这与你必须在c / c ++中空终止字符串的原因相同 - 表示数组的结尾。
简而言之,您可以自己跟踪阵列的大小。如果分配一个40字节的数组,则必须确保永远不要访问第40个索引之上的数组(即数组[39])。
希望这有帮助。