1.會產生野指針的做法
#include <stdio.h> //這就是一種錯誤的寫法 int main(){ int *p = NULL; p = (int *)malloc(4); //釋放P所指向的內存空間,但指針變量p仍然留在棧中,成為了野指針 if (p != NULL){ free(p); } if (p != NULL){ free(p); } return 0; }
2.正確的做法:
#include <stdio.h>//指針變量和指針所指向的內存變量是兩個不同的概念 //使用動態內存分為三步 //1.定義時,將指針為定義NULL //2.釋放內存時,把指針變量重新賦值或者NULL //3.釋放內存后,把指針變量賦值為NULL int main02() { int *p = NULL; p = (int *)malloc(4); //這才是正確的寫法 if (p != NULL){ free(p);//釋放P所指向的內存空間,但指針變量p仍然留在棧中,成為了野指針 p = NULL;//釋放野指針 } return 0; }
3.間接賦值是指針存在的最大意義
間接賦值的條件:
(1)定義實參(普通變量)和形參(指針變量)
(2)把實參的地址傳給形參
(3)利用形參來修改實參的值
被調用函數分配的內存,結果傳出來的兩種方法
(1)return
(2)指針做函數參數
//這種方式是通過return將函數分配的內存傳給被調用函數
char *getBuf() { char *p = NULL; p = (char *)malloc(100); strcpy(p, "zhanghanzhi"); return p; }
//這種方式是通過指針作為函數參數間接賦值 void getBuf(char *p) { char tmp = NULL; tmp = (char *)malloc(100); strcpy(tmp, "zhanghanzhi"); p = tmp; } int main() { //1.定義實參(普通變量)和形參(指針變量) char *p; //2.把實參的地址傳給形參 //3.利用形參來修改實參的值 getBuf(p); return 0; }
4.幾個本質
數據類型:數據類型的本質是固定大小內存的別名。對變量聲明數據類型,是為了告訴編譯器分配幾個字節的內存。
變量:變量的本質是一段內存空間的別名。也就是給一段內存空間取一個新的名字,就是變量。
指針:指針也是一種數據類型,它的值是某一個內存空間的地址。指針的步長根據它指向的內存空間的數據類型而定。
*p在等號左邊是對p所指向的內存空間賦值;*p放在等號的右邊是對p所指向的內存空間取值。
數組中[]的本質:假如有數組array,則array[i]等價於*(array+i),是因為[]對於程序員來講是友好的,但是編譯器最終還是要將它理解為指針,也就是數組作為函數參數時的退化。array[i] ==> array[0+i] ==>*(array+i)
