1. 程式人生 > >初夏小談:野指標(隱形殺手):幹翻了多少英雄漢(乾貨!!!)

初夏小談:野指標(隱形殺手):幹翻了多少英雄漢(乾貨!!!)

前言

如果學習了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裡面儲存的是已經釋放的記憶體地址但它和釋放的記憶體是兩路人,兩者沒有什麼聯絡,要說強行聯絡,只能說指標戀戀不捨原來的記憶體就存了一份記憶體的影子罷了。

                                                                                                                                                           珍&原始碼