今天 在做项目时,遇到一个问题:定义一个长度为3的char 数组,把它作为参数,传递给函数,再计算长度,却得不到预期结果。
具体看下面代码:
int GetLength(char arr[]);
int main()
{
int len;
char temp[] ={1,2,3};
len = GetLength(temp);
cout<<len<<endl;
return 0;
}
int GetLength(char arr[])
{
return sizeof(arr) / sizeof(arr[0]);
}
打印结果为:4
预期结果为:3
所以,就郁闷了,本来定义长度为3,怎么跑出4来呢?
debug 时,在watch中,故意写temp[3],下标越界,以为会报错,没有想到不但没有报错,居然还跑203的值来,郁闷!
查了资料:
1.编译器并不对数组下标越界做检测,
2.参数传递方式。
这里的数组是使用地址传递,所以到函数GetLength那里,就只是一个地址而已了,在win32系统里地址长度为32bit,
故用sizeof(arr)得出来的结果为4,所以,出现以上的问题的就不足为奇了。
解决方法:
如果要使用数组作参数,又要操作数组长度,一般把长度也作为一个参数传递给函数。