初夏小談:野指標(隱形殺手):幹翻了多少英雄漢(乾貨!!!)
前言:
如果學習了C語言,沒有好好研究記憶體管理的話,恐怕C語言還是很模糊吧,當我跟著學校老師的步伐學完C語言之後,我可以說是和小白沒什麼兩樣。不是說老師教的不好,只是C語言真的太經典了。如果對它沒有精心的去好好研究,那真的入門都不算。當我第一次學完C語言時,感覺腦子很亂,傻傻地連指標都搞不清楚,總想著去掉那個星號(*)哈哈 ^_^,但之後我真的不想為了考試而學C語言,那樣會失去學習的樂趣以及動力。找C語言各種書檢視,學習終於有了一定的進步,當然還是很菜哈哈。
好了步入今天正式的主題《C語言之野指標》
來說說野指標(也叫懸垂指標)這玩意,這個玩意說實話真的噁心,我敲程式碼期間踩過不少的坑,這是bug的一個重大來源,而且不易被發現。所謂野指標就是一個指標指向了一塊不屬於它管理範圍的記憶體。常見幾種情況。
第一種:就是在函式體中定義並初始化了一個數組,然後用指標指向這個陣列,返回這個指標,在main函式中接收這個指標。這一類。不明白?舉個例子:
char* Test2() { char arr[] = "abcdef"; char* ptr = &arr; return ptr; }
就像這一類,在mian函式中是可以接收到原來arr陣列的地址但是,那塊記憶體是在棧上開闢的函式結束時,就已經被釋放,不歸指標所管理。訪問記憶體出錯。
第二種:就是動態開闢記憶體後,及時free了,雖然用free這把刀斬斷了指標和指向了動態開闢的那塊記憶體,但是沒有把這個指標置NULL,這個NULL就像當與栓野狗的鏈子(當然野狗就是那個指標),那你如果不栓起來,它就會瞎搞。舉個例子:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void Test() { char* ptr = (char*)malloc(1024); strcpy(ptr, "hello C"); free(ptr); if (NULL != ptr) { strcpy(ptr, "C NiuBi"); } printf(ptr); } int main() { Test(); system("pause"); return 0; }
程式碼中條件並沒有卵用,它還會執行。將會出錯。因為那塊記憶體已經被釋放。不屬於它。雖然ptr裡面儲存的是已經釋放的記憶體地址但它和釋放的記憶體是兩路人,兩者沒有什麼聯絡,要說強行聯絡,只能說指標戀戀不捨原來的記憶體就存了一份記憶體的影子罷了。
珍&原始碼