數組越界怎么處理 數組越界( 四 )


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++和算法的優質內容,學習交流,技術探討,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等著你!
還沒關注的小伙伴,可以長按關注一下:
數組越界怎么處理  數組越界

文章插圖

推薦閱讀