① c語言,空指針,野指針,通用指針
空指針:空指針是一個特殊的指針值,也是唯一一個對任何指針類型都合法的指針值。指針變數具有空指針值,表示它當時處於閑置狀態,沒有指向有意義的東西。
通用指針:通用指針,它可以指向任何類型的變數。通用指針的類型用(void *)表示,因此也稱為void 指針。
野指針:野指針也就是指向不可用內存區域的指針。通常對這種指針進行操作的話,將會使程序發生不可預知的錯誤。
空指針是一個特殊的指針值,也是唯一一個對任何指針類型都合法的指針值。指針變數具有空指針值,表示它當時處於閑置狀態,沒有指向有意義的東西。空指針用0表示,C語言保證這個值不會是任何對象的地址。給指針值賦零則使它不再指向任何有意義的東西。為了提高程序的可讀性,標准庫定義了一個與0等價的符號常量NULL. 程序里可以寫 p = 0; 或者 p = NULL; 兩種寫法都把p置為空指針值。相對而言,前一種寫法更容易使讀程序的人意識到這里是一個指針賦值。我們印象中C語言的指針都有類型,實際上也存在一種例外。
這里涉及到通用指針,它可以指向任何類型的變數。通用指針的類型用(void *)表示,因此也稱為void 指針。
野指針,也就是指向不可用內存區域的指針。通常對這種指針進行操作的話,將會使程序發生不可預知的錯誤。
「野指針」不是NULL指針,是指向「垃圾」內存的指針。人們一般不會錯用NULL指針,因為用if語句很容易判斷。但是「野指針」是很危險的,if語句對它不起作用。野指針的成因主要有兩種:
①指針變數沒有被初始化。任何指針變數剛被創建時不會自動成為NULL指針,它的預設值是隨機的,它會亂指一氣。所以,指針變數在創建的同時應當被初始化,要麼將指針設置為NULL,要麼讓它指向合法的內存。
②指針p被free或者delete之後,沒有置為NULL,讓人誤以為p是個合法的指針。別看free和delete的名字惡狠狠的(尤其是delete),它們只是把指針所指的內存給釋放掉,但並沒有把指針本身幹掉。通常會用語句if (p != NULL)進行防錯處理。很遺憾,此時if語句起不到防錯作用,因為即便p不是NULL指針,它也不指向合法的內存塊。
② C語言 野指針
char *p = (char *)malloc(10);free(p);你開辟空間,然後釋放,這時釋放的是開辟的內存空間,而就本身的p而言,它還是指向那片內存的,這是你用p,編譯程序的時候不會出錯,但是一運行,程序就會出錯,這里的p就是野指針,為了杜絕野指針,可以在free(p);下面加上p = NULL;就行了
③ c語言野指針釋放為題求大神指點迷津,為什麼我每次到free(myarray[i])就出問題
嗯,指針的指針的指針。。。。。。
func(int a) {} -- 在func裡面修改了a值,返回後a值是否會變? NO! 而func(int &a) {}則可以。
同理啊, 現在:void spitString05_free(char **myarray),雖然是指針的指針,但傳入的時候,只是做了一個拷貝而已。返回後這個myarray並沒有被真正釋放。為此你的free函數需要修改為:
voidspitString05_free(char***myarray,intncount)
{
inti=0;
if(*myarray==NULL)
{
return;
}
for(i=0;i<ncount;i++)
{
if((*myarray)[i]!=NULL)free((*myarray)[i]);//應該OK了!
}
if(*myarray)
{
free(*myarray);
}
*myarray=NULL;//垃圾值--不再是!
}
【注意】:調用的時候:
spitString05_free(&myarray1,10)
④ C語言的野指針,請大家給意見和答案
這是因為func(str++)是先使用後++,就是說先用func(str)運行,運行完了再++,這樣你的func(str)就是一個死循環了,永遠不會退出,當然也就沒法++了。至於func(++str),這樣直接改變了str的值,所以當函數遞歸回來時printf("%c",*str);輸出的時候str已經改變了,就是說先改變了再輸出,所以a就不會輸出了
⑤ 關於野指針,瘋了。。。請問該怎麼辦啊。。。怎麼辦啊。。。
temp的地址與temp=head->next(就是temp的值)是兩個東西!temp是一個指針,他的值是一個地址,temp本身有一個地址。這里估計你的temp指針類型不是簡單的,可能有初始化的問題。
⑥ c語言函數中返回的指針並不是野指針按理來說變數s被清空後,應該不會顯示7才對的。
返回是野指針沒錯.
只不過你這個程序太小了,
s退出函數釋放後, 這段內存還沒有被用作其他用途.
所以指針指向的空間還是原來的值7
內存空間被釋放, 只是系統標明這段內存可以被其他代碼使用了,並不會改變它的值.
⑦ c語言野指針和指針空懸的區別是什麼
野指針是指針聲明了指針變數後沒有初始化,其中的數據是機器垃圾值;指針空懸是指這個指針正常使用過,但指向的目標在程序流程中已經消失了,沒有將及時將該指針置為無效(即==NULL)。
⑧ c語言指針被free後要怎麼處理防止野指針
將指針置零
比如p是一個指針
free(p);之後再加一句p = NULL;
⑨ C語言野指針就是未初始化的指針么
野指針是指指向垃圾內存的指針,未初始化只是其中一種而已,還有就是malloc分配內存的指針未釋放,越過了變數的作用范圍。大概就這三種。
⑩ c語言。。 什麼是野指針
野指針 指 不知道 指哪去兒去的指針。
strcpy中的s1與s2,如果按照嚴格的編程設計規則,是應該進行一些必要的檢查,比如判斷這兩個指針是不是NULL。但這種檢查很難確定其是否是野指針,這是其一。其次,在C語言中,這種功能很明確的函數,為了追求效率,一般都不會做太多的檢查,而是由調用者來確保入口參數的有效性。