数组越界怎么处理 数组越界( 四 )


1void Init(int arr[])
2{
3 size_t i=0;
4 for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
5 {
6 arr[i]=i;
7 }
8}
9int main(void)
10{
11 int i=0;
12 int a[10];
13 Init(a);
14 for(i=0;i<10;i++)
15 {
16 printf("%d\n",a[i]);
17 }
18 return 0;
19}
从表面看,上面代码的输出结果应该是0,1,2,3,4,5,6,7,8,9,但实际结果却出乎我们的意料,如图 1 所示 。

数组越界怎么处理  数组越界

文章插图

图 1 示例代码在 VC++2010 中的运行结果
是什么原因导致这个结果呢?很显然,上面的示例代码在void Init(int arr[])函数中接收了一个int arr[]类型的形参,并且在main函数中向它传递一个a[10]实参 。同时,在 Init() 函数中通过sizeof(arr)/sizeof(arr[0])来确定这个数组元素的数量和初始化值 。
在这里出现了一个很大问题:由于 arr 参数是一个形参,它是一个指针类型,其结果是sizeof(arr)=sizeof(int*) 。在 IA-32 中,sizeof(arr)/sizeof(arr[0])的结果为 1 。因此,最后的结果如图 1 所示 。
对于上面的示例代码,我们可以通过传入数组的长度的方式来解决这个问题,示例代码如下:
1void Init(int arr[],size_t arr_len)
2{
3 size_t i=0;
4 for(i=0;i<arr_len;i++)
5 {
6 arr[i]=i;
7 }
8}
9int main(void)
10{
11 int i=0;
12 int a[10];
13 Init(a,10);
14 for(i=0;i<10;i++)
15 {
16 printf("%d\n",a[i]);
17 }
18 return 0;
19}
除此之外,我们还可以通过指针的方式来解决上面的问题,示例代码如下所示:
1void Init(int (*arr)[10])
2{
3 size_t i=0;
4 for(i=0;i< sizeof(*arr)/sizeof(int);i++)
5 {
6 (*arr)[i]=i;
7 }
8}
9int main(void)
10{
11 int i=0;
12 int a[10];
13 Init(&a);
14 for(i=0;i<10;i++)
15 {
16 printf("%d\n",a[i]);
17 }
18 return 0;
19}
现在,Init() 函数中的 arr 参数是一个指向arr[10]类型的指针 。需要特别注意的是,这里绝对不能够使用void Init(int(*arr)[])来声明函数,而是必须指明要传入的数组的大小,否则sizeof(*arr)无法计算 。但是在这种情况下,再通过 sizeof 来计算数组大小已经没有意义了,因为此时数组大小已经指定为 10 了 。
最后
特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!
还没关注的小伙伴,可以长按关注一下:
数组越界怎么处理  数组越界

文章插图

推荐阅读