數組和對應指針的NULL初始化函數
數組使用以前要先對其初始化url
char Outi[4] = { NULL }; char Outj[4] = { NULL };
對應指針進行動態初始化spa
1 #define SIZE 4 2 3 char *Outi = (char *)malloc(SIZE * sizeof(char)); 4 memset(Outi, 0, SIZE * sizeof(char)); 5 6 for (int i = 0; i <4; i++) 7 strcat(Outi, "1"); 8 9 10 free(Outi); 11 Outi = NULL;
分配內存後,須要對內存進行釋放,程序對內存進行釋放後,並不會將其置爲NULL,必須手動將指針置爲NULL,防止訪問野指針或再次釋放出錯。操作系統
釋放內存觸發斷點.net
上面對應指針進行初始化的代碼中,運行起來會在釋放內存處觸發斷點,由於Outi開闢了4個char的內存,可是strcat函數執行後會在結尾添加NUL字節,即'\0'結尾標識符,則會超過了緩衝區自己的容量,溢出的數據覆蓋在合法數據上,所以釋放時會報錯,這種錯誤稱爲緩衝區溢出。指針
解決方法:指針開闢動態內存時,須要多開闢一個數據類型的空間。調試
緩衝區溢出:緩衝區溢出是指當計算機向緩衝區內填充數據位數時超過了緩衝區自己的容量溢出的數據覆蓋在合法數據上,理想的狀況是程序檢查數據長度並不容許輸入超過緩衝區長度的字符,可是絕大多數程序都會假設數據長度老是與所分配的儲存空間相匹配,這就爲緩衝區溢出埋下隱患.操做系統所使用的緩衝區 又被稱爲"堆棧". 在各個操做進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩衝區溢出。code
棧溢出:棧溢出就是緩衝區溢出的一種。 因爲緩衝區溢出而使得有用的存儲單元被改寫,每每會引起不可預料的後果。程序在運行過程當中,爲了臨時存取數據的須要,通常都要分配一些內存空間,一般稱這些空間爲緩衝區。若是向緩衝區中寫入超過其自己長度的數據,以至於緩衝區沒法容納,就會形成緩衝區之外的存儲單元被改寫,這種現象就稱爲緩衝區溢出。blog
棧溢出是緩衝區溢出的一種。