例子41-1:編程
#include"stdio.h" #include"malloc.h" int main() { int*p1 = (int*)malloc(40); int*p2 = (int*)1234567; //整型值強制類型轉化爲指針類型,錯誤的強制類型轉化 int i = 0; printf("%p\n",p1); for(i = 0;i < 40;i ++) { *(p1 + i) = 40 - i; //40個字節只有十個整型,循環40次,40*4 = 160個整型,動態內存不夠 } //因爲指針運算產生了野指針,改寫了非法的內存地址 free(p1); printf("%p\n",p1); for(i = 0;i < 40;i ++) { p1[i] = p2[i]; //使用了已經釋放的內存空間 } return 0; }
輸出結果:
錯誤
修改後正確代碼:數組
#include"stdio.h" #include"malloc.h" int arr[40] = {1,2,3,4,5,6,7}; int main() { int*p1 = (int*)malloc(40*sizeof(int)); int*p2 = (int*)arr; int i = 0; printf("%p\n",p1); for(i = 0;i < 40;i ++) { *(p1 + i) = 40 - i; } free(p1); p1 = NULL; printf("%p\n",p1); for(i = 0;i < 40;i ++) { p1[i] = p2[i]; } return 0; }
輸出結果:函數
00931260 00000000
例子41-2:指針
#include "stdio.h" #include "malloc.h" #include "string.h" struct Student { char* name; int number; } char* func() { char p[] = "D.T.Software"; return p; } void del(char* p) { printf("%s\n",p); free(p); } int main() { struct Student s; //因爲沒有初始化,產生野指針 char* p =func();//產生了野指針 strcpy(s,name,p);//使用了野指針 s.name = 99; p = (char*)malloc(5); strcpy(p,"D.T.Software");//產生內存越界,操做了野指針所指向的內存空間 del(p); return 0; }
內存錯誤是實際產品開發中最多見的問題,然而絕大多數的bug均可以經過遵循基本的編程原則和規範來避免。調試