空指標與野指標

2021-08-21 20:27:26 字數 2425 閱讀 3721

首先什麼是空型別呢,空型別就是void,自然,空型別指標就是void *

void *可以指向任何型別物件的位址,表示這是乙個指標,和位址值有關,但不知道儲存在此位址上的物件的型別,所以在取空型別指標所指向的值的時候,應將空型別指標轉換為對應的指標型別

int a = 10;

char b = 'a';

float c = 12.0;

void *pa = &a;

void *pb = &b;

void *pc = &c;

int aa = (int)(*pa); //錯誤

執行的話,編譯器會提示以下錯誤:

修改:

int aa = *((int*)pa);
裡面的括號(int*)表示將空型別指標pa強轉為int型指標,外面這個括號還外加乙個*號,表示取該int型指標所指向的值

1)空指標支援的操作

a. 與另乙個指標比較

b. 向函式傳遞void *指標

c. 在函式裡返回void *指標

d. 給另乙個void *指標賦值

2)空指標不支援的操作

a. 不支援解引用,不能獲取指向物件的值

b. 不能進行指標運算,比如移位操作

指向乙個非法的或已銷毀的記憶體的指標

危害:對系統造成不可預知的錯誤

1)指標變數沒有被初始化,它預設值是隨機的,它會亂指一氣,例如:

char *p;     //野指標,p的值是隨機的
int *pd;

printf("%p\n", pd);

在printf中,列印指標的值用%p

編譯器會提示錯誤:

為了避免此類野指標的出現,指標變數在建立的同時應該被初始化,要麼將它設定為null,要麼讓它指向合法的記憶體,例如:

char *p = null  //#define null 0

char *p = (char*) malloc(100);

malloc的全稱是memory allocation,中文叫動態記憶體分配,用於申請一塊連續的指定大小的記憶體塊區域以void*型別返回分配的記憶體區域位址,當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體。malloc函式

因為malloc返回的是乙個空型別指標,所以需要強轉

2)指標p被free或者delete之後,只是把指標所指的記憶體釋放掉了,沒有改變指標的值,此時,p淪落為野指標

這就好比你的親戚搬家了,你手上還留著他的舊位址

char str1 = "hello";

char str2 = "world";

char *pd = (char*)malloc(100);

strcpy(pd, str1); //正確,將字串str1複製到指定的記憶體中去

我們發現,1)記憶體經過free釋放後,指標的值並沒有被釋放,還是指在同樣的位置裡;2)第乙個strcpy複製語句正確,將乙個字串複製到系統分配的記憶體中去,然後第二個strcpy複製語句雖然得到了正確的結果,但它是極其危險的,因為它將乙個字串複製到乙個沒有經過系統分配的記憶體中去了,此時的pd指標也是乙個野指標

解決此類野指標問題,我們應該當指標指向的記憶體被釋放時,我們也應該將指標置空

空指標與野指標

野指標 不是null指標,是指向 垃圾 記憶體的指標。人們一般不會錯用null指標,因為用if語句很容易判斷。但是 野指標 是很危險的,if語句對它不起作用。野指標的成因主要有兩種 一 指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的,它會亂指一氣。所以,指標...

野指標與空指標

一 空指標 空指標不指向任何物件,在檢視使用乙個指標之前可以首先檢查它是否為空。定義空指標 1 int p1 nullptr 等價於int p1 0 2int p2 0 直接將p2初始化為字母常量034 要包含 include 5 int p3 null 等價於int p3 0 1 null 在c中...

指標,野指標,空指標,賦值?

bug中最可怕的是野指標,那麼問題來了,野指標是什麼?是如何產生的?為什麼程式設計師會 忘記 昨天除錯時,我發現了乙個野指標,由此我明白了。a的值成了亂碼,而且gcc編譯器並沒有報錯,那麼請看下面的 那麼我們假設a是指標,一旦我們如同該 一般不讓a指向元素的話,編譯器 必然是會報錯的,那麼我們不如假...