1. 程式人生 > 其它 >二維陣列越界和初始化問題

二維陣列越界和初始化問題

技術標籤:c語言儲存器

二維陣列越界問題

#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’
    • 記憶體排列
      • image-20210125173226256
      • 在記憶體中,所有的行連續儲存在儲存器中(隨便找的圖,意思是這個意思)
      • 所以訪問a[0] [5]會輸出0 對應的就是a[2] [1] 中的’\0’
      • 最後超出a[0] [6]不在陣列初始化範圍內,所以資料隨機
      • 超出範圍編譯器進行警告但沒有報錯