C語言進階之路(三)----野指針的產生原因及解決辦法


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM