我們從乙個例子說起:
test1.c
char a[5] = ;
test2.c
#include
extern char *a;
int main()
在linux下用gcc編譯:
gcc -g test1.c test2.c -o test
執行結果如下:[root@localhost cprofessor]# ./test
the a[0]'s address is : 64636261
segmentation fault
這裡出現了記憶體越界的提示。
為什麼會出現這種原因呢,是因為編譯器對陣列和指標處理不同。
對於陣列
char a[5] = ;
我們用a[3]來說明
但是對於指標來說:
char *p
第三步:根據p的值來定址得到運算元。
所以當你把陣列引用成指標,那麼編譯器就會把陣列當成指標處理p[i],從而第二步本來應該得到運算元,結果卻當成了位址。乙個字元被當成位址,基本可以斷定越界了。。。
這個bug本來編譯器應該給出的,但是gcc沒有對此問題作出反應,應該算gcc的乙個bug,如果誰的程式寫成這個,並且僥倖通過執行,那麼這就是乙個漏洞,嘿嘿~
嘿嘿,又學到一招,與大家分享,希望能幫助到大家。
深度剖析指標和陣列
什麼是指標?什麼是陣列?在電腦科學中,指標是程式語言中的乙個物件,利用位址,它的值直接指向存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為指標。意思是通過它能找到以他為位址的記憶體單元。而陣列是乙個有限空間,他與指標是兩碼事,有時候...
指標的深度剖析
在c語言中,指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元。指標變數和指標 將乙個變數的位址稱為變數的指標,存...
深度剖析 函式指標
宣告 下面 所有在windows7 vs2010環境下編譯通過。並執行無誤。是指向函式的指標變數,在c編譯時。每個函式都有乙個入口位址。那麼這個指向這個函式的函式指標便指向這個位址。函式指標的用途是非常大的,主要有兩個作用 用作呼叫函式和做函式的引數。資料型別標誌符 指標變數名 形參列表 一般函式的...