二維陣列越界和初始化問題
阿新 • • 發佈:2021-01-27
二維陣列越界問題
#include <stdio.h>
int main(int argc, char *argv[]) {
int a[][2]={1,2,3,5,6};
for (int i=0;i<3;i++) {
for (int j=0;j<2;j++) {
if (a[i][j]=='\0') {
continue;
}
printf("%d ",a[i][j]);
}
}
printf("\n %d ",a[0][4]);
printf ("\n %d ",a[0][5]);
printf("\n %d ",a[0][6]);
}
Untitled 3.c:16:18: warning: array index 4 is past the end of the array (which contains 2 elements) [-Warray-bounds]
printf("\n %d ",a[0][4]);
^ ~
Untitled 3.c:4:2: note: array 'a' declared here
int a[][2]={1,2,3,5,6};
^
Untitled 3.c:17:18: warning: array index 5 is past the end of the array (which contains 2 elements) [-Warray-bounds]
printf("\n %d ",a[0][5]);
^ ~
Untitled 3.c:4:2: note: array 'a' declared here
int a[][2]={1,2,3,5,6} ;
^
2 warnings generated.
1 2 3 5 6
6
0
ns 2 elements) [-Warray-bounds]
printf("\n %d ",a[0][6]);
^ ~
Untitled 3.c:4:2: note: array 'a' declared here
int a[][2]={1,2,3,5,6};
^
3 warnings generated.
1 2 3 5 6
6
0
-1591672656
- 可以看出2個問題
- 初始化
- 只設置了列的引數,為2,沒設定行,編譯器自動計算,分配成了三行
- 每一行沒有’\0’結尾
- 規定列數後,自動計算行數,沒有在花括號中初始化的陣列位置被預設以3行2列初始化,所以a[2] [1] = ‘\0’
- 記憶體排列
- 在記憶體中,所有的行連續儲存在儲存器中(隨便找的圖,意思是這個意思)
- 所以訪問a[0] [5]會輸出0 對應的就是a[2] [1] 中的’\0’
- 最後超出a[0] [6]不在陣列初始化範圍內,所以資料隨機
- 超出範圍編譯器進行警告但沒有報錯
- 初始化