首先什麼是空型別呢,空型別就是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的值是隨機的
在printf中,列印指標的值用%pint *pd;
printf("%p\n", pd);
編譯器會提示錯誤:
為了避免此類野指標的出現,指標變數在建立的同時應該被初始化,要麼將它設定為null,要麼讓它指向合法的記憶體,例如:
malloc的全稱是memory allocation,中文叫動態記憶體分配,用於申請一塊連續的指定大小的記憶體塊區域以void*型別返回分配的記憶體區域位址,當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體。malloc函式char *p = null //#define null 0
char *p = (char*) malloc(100);
因為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指向元素的話,編譯器 必然是會報錯的,那麼我們不如假...