1.內存洩漏:申請的堆內存沒有釋放。
2.內存污染:前面非法操作使用內存(沒有報錯),後面寫著寫著就出錯。如下代碼:
當結構體中只有劃線部分代碼時,在編譯器中編寫不會報錯,但此時已經造成非法操作內存,下面再給結構體添加一些變量,此時就會報錯,不讓再定義變量(這種錯誤特別不好調試)需要注意。
3.對空字符串和非法字符串的判斷:
圖中畫藍線的部分:應該判斷的是指針變量的值,而不是指針指向的內存
4.指針越界:如:str[3] = "abc";
5.指針的疊加會不斷改變指針的指向。
如:char *p ="sdfg"; p++; printf("%s\n",p);打印結果為:"dfg";。指針的只想被改變,如果再疊加4次,就打印不出內容了,因為指針此時已經指向了結束符。
6.棧區局部變量的地址不要往外傳。如:
char *get_str() { char str[] = "abcdedsgads"; //棧區, printf("[get_str]str = %s\n", str); return str; }
7.同一塊內存區域被多次釋放;如
har *p = NULL; p = (char *)malloc(50); strcpy(p, "abcdef"); if (p != NULL) { //free()函數的功能只是告訴系統 p 指向的內存可以回收了 // 就是說,p 指向的內存使用權交還給系統 //但是,p的值還是原來的值(野指針),p還是指向原來的內存 free(p); } if (p != NULL) { free(p); }