C語言之通過陣列訪問位址的鬼才操作(部分錯誤操作)

2021-10-08 00:23:55 字數 2448 閱讀 9306

//初始化定義程式:

void

main

(void

)

//程式呼叫端

code[0]

=num%

10;

code[1]

=num/10%

10;

code[2]

=num/

100%

10;

code[3]

=num/

1000%10

; code[4]

=fre%

10;

code[5]

=fre/10%

10;

code[6]

=fre/

100%

10;

code[7]

=fre/

1000%10

;

執行平台:51微控制器+keil5

現象描述:使用buf可以訪問到code_1的陣列內容。

原因分析:

因為,分開連續定義兩個4個8位char型記憶體,但是型別一樣,於是cpu可以讀取連續陣列無誤。在記憶體層面,呼叫陣列記憶體是沒有陣列名字,buf[7]就是讀buf[0]位址偏移7位的位址,位址型別都一樣,所以寫入和讀取正常,沒有非法訪問現象。

另外乙個原因就是51的gcc編譯器檢錯能力比較有限。

int main (),

,};printf

("輸出結果為:%d\n"

, a[1]

[2])

;printf

("輸出結果為:%d\n"

, a[1]

[0])

;printf

("輸出結果為:%d\n"

, a[1]

[1])

;printf

("輸出結果為:%d\n"

, a[1]

[3])

;printf

("輸出結果為:%d\n"

, a[0]

[3])

;printf

("輸出結果為:%d\n"

, a[0]

[2])

;return0;

}

輸出結果都為0

int main ()}

,},}

;printf

("輸出結果為:%d\n"

, a[1]

[0][

0]);

printf

("輸出結果為:%d\n"

, a[5]

);return0;

}

#include

int main (),

},,}

};int(

*p)[2]

[3]= a3d;

printf

("輸出結果為:%d\n",*

(*(*

(p+1)+

1)+1

));return0;

}

輸出結果為:2

*(p+1) 代表當前a[0][0][0]加到a[1][0][0]

*

int a[2]

[2][

3]=;

int*p =

&(a[0]

[0][

0]);

///* for(int i = 0; i < 2*2*3; i++)

*(p+i) = i; */

printf

("a的值為:%d\n",*

(p+(0*

3+0*

3+1)

));printf

("***************\n");

for(

int i =

0; i <2*

2*3; i++

)printf

("a的值為:%d\n",*

(p+i)

);

//編譯提示warning,錯誤寫法

int a[2]

[2][

3]=;

int*p = a;

printf

("a的值為:%d\n",*

(p+(0*

3+0*

3+1)

));printf

("***************\n");

for(

int i =

0; i <2*

2*3; i++

)printf

("a的值為:%d\n",*

(p+i)

);

C語言之陣列的使用

c語言中,陣列主要用來處理批量資料 查表 陣列的特點 1 陣列內資料有序排放 2 陣列中每個元素都屬於同一資料型別 這裡主要介紹一維陣列 二維陣列和字元陣列 字串處理函式 定義 初始化和引用陣列 定義 型別名 陣列名 常量表示式 如 int a 10 常量表示式 元素個數,陣列長度 下標從0開始 c...

通過陣列名訪問陣列元素的一些常見小計算

陣列名的含義有以下幾種情況 1.陣列名在如下情況表示整個陣列 1 在定義陣列的同乙個函式,求sizeof arr 2 在定義陣列的同乙個函式,arr 1 2.其他情況下陣列名表示陣列首元素的位址 我們先定義乙個一維陣列 int main 聚合型別 初始化一部分剩餘部分為0 printf x n ar...

C語言之對多維陣列的簡易理解

在平常學習的過程中,必定會經常跟陣列打交道並且也經常使用陣列,不管是一維陣列也好還是多維陣列也罷,陣列可以說是時常出現。相比較而言,對一維陣列來說,理解以及使用都是輕車熟路。但是相比一維陣列,多維陣列的使用以及理解卻有些偏差。在此,我對多維陣列進行了簡易的理解。首先以一維陣列為例。要畫出乙個一維陣列...