1. 程式人生 > >【linux c】什麼是野指標以及如何避免野指標_學習筆記_010

【linux c】什麼是野指標以及如何避免野指標_學習筆記_010

1.首先以一個示例來認識野指標:

#include <stdio.h>
 
int main()
{
    int * p;
    scanf("%d", p);
    printf("%d\n", * p);
   
    return 0;
}


該段程式編譯並未報任何錯誤,而執行之後,輸入具體值後,報段錯誤:

2

段錯誤

為什麼會出現段錯誤?

因為此處定義了一個區域性變數,系統隨機分配給p一個地址,往p儲存的隨機地址中賦值,該值不一定可用。

說了這麼多,那麼什麼是野指標

野指標:隨機指向一塊記憶體指標。這樣的指標會導致記憶體洩漏(沒有讓p使用卻使用了)。

不可用記憶體區域主要分為兩塊:

①指向沒有訪問許可權的記憶體;

②指向已經釋放的記憶體。

但是為什麼有時候用了野指標,卻可以正常執行呢?

這就好比你在路上撿了一把鑰匙,雖然可以開對應的房間門,但是卻不能隨意去開人家的門,這是犯法。但是,當你撿到的鑰匙是自己家的,或者是女朋友家的,你就可以合法地開門了。

執行正常,就是因為野指標撿到了自己家的”鑰匙”。

2.如何避免野指標

以一個示例來講解如何避免野指標:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_SIZE sizeof(char) * 100

int main()
{
    char *ptr = NULL;       //若定義的指標沒有指向,則賦值為空

    ptr = (char *)malloc(MAX_SIZE);     //為指標分配動態記憶體空間

    if(NULL == ptr)     //判斷動態記憶體是否分配成功
    {
        printf("error malloc\n");
	    exit(1);
    }
    memset(ptr, 0, MAX_SIZE);       //對分配的記憶體進行初始化,初始化為0

    scanf("%s", ptr);       
    printf("ptr = %s\n",ptr);

    free(ptr);      //指標使用完後釋放記憶體
    ptr = NULL;     //釋放後將指標置為空

    return 0;
}

野指標無法完全杜絕,但是通過如上的編碼規範,可以很大程度上避免野指標。