C 中的指標是最方便和靈活的,也是最頭疼的。在鏈表的建立過程中,大家
一般都用指標,那麼請看下面一段程式:
struct item_t { typename Someinfo ;item_t * Next ; // 下一個結構
的指標。
}
int built (item_t * head ) // 以head為頭建立一個鏈表{ item_t * Temp
;
temp =Head;for (int i=0 ;i<ITEMNUM ;i++ ) { temp = (item_t *)
malloc(sizeof(item_t));if(temp==NULL)
return 0;temp =temp->Next;} return 1;} 短短的一段程式,想當然的
寫成了這樣,其中有將近四個錯誤一是傳進來的 head 在函數裡沒有任何改變。
二是就算 head 在函數裡被改變,可對於調用者 built(pointer )來說,在函
數調用結束之後pointer 的值並沒有任何改變!!第三,讓我們來看看建立過程,
先為temp分配一段空間,然後再將temp置為temp->next,我們不妨在這兒將程式
改為
temp1 =temp ;//新增加的語句temp =temp->next;然後又迴圈過來,又給
temp分配空間,注意!!temp1->next 的值並沒有改變,程式所做的只是將temp
重新賦了一個值而已!
這樣的程式只有出毛病的份了。
現將上一次的程式加上一個函數
int add (item_t * obj);功能是將obj 指向的結構放在鏈表的尾端,函
數體如下:
int add (item_t * obj)
{ item_t * Temp ;
if(obj==NULL )
return 0;
Temp =head;//head為一全域變數,為隊列的頭指標。
while (Temp->Next!=NULL ) { Temp =Temp->Next ;} Temp->Next =obj
;return 1;}
這裡首先有一個問題:如果隊列為空白如何處理?
於是需要加入如下程式段:
if(head==NULL) { head =obj;return 0;} 可是運行這樣的程式是要冒
極大的風險的,因為函數包括了以下的幾個約定:
1:所有的item_t類型的元素被初始化時,他的Next指標必須被初始化為 NULL.
2:所有傳遞給 add(item_t *)的指標必須是不同元素的地址!而且最好是用
動態分配的。
如果這兩條沒有被很好的遵守的話,麻煩就來了,看如下的調用:
:for (int i=0 ;i<10;i++ ) { item_t test;test.Someinfo =make_a_new_info
(……);test.Next =NULL ;add (&test );} :你試著想象一下結果好嗎?
再有如下的例子:void add_some_item(void)
{ item_t test ;test.someinfo =make_a_new_info(……);test.Next
=NULL ;add (&test );} 在函數執行完畢之後,test的記憶體將被釋放掉,也
就是說,在以head為頭的鏈表中,有一個懸空的指標!!!這會造成系統的崩潰!!!
足夠多的指標了嗎?不!指標的錯誤是舉不勝舉的。
再看下面一個:C語言裡,數組名是被看作指標來使用的,一維數組是指標,
二維數組是指向指標的指標,三維是……
真的是這樣的嗎??
看下面的例子:
void show (int * * info,int x ,int y )//列印一個x*y 的數組的內
容{ int i ,j ;for (i=0 ;i<x ;i++ ) { for(j=0 ;j<y ;j++ ) { printf
("%d " ,info[i][j]);} printf("\n");}
在進行如下調用之後,你的系統有崩潰的可能!
void Function (void)
{ int as [10][10] ;:show(as,10,10);:} 為什嗎?在c 中,二維
數組雖然是定義為指向指標的指標,但是實際上被指向的指標是不存在的,只是
在執行as [n]時返回一個指標罷了,as所指的不過是存放數組內容的地址!!
如何避免指標錯誤*********************************************************
這是一個很大的題目,如我所說,指標的錯誤是多種多樣的沒有一個完全的
方法來避免,但因此而不用指標亦是不可取的。避免指標錯誤的方法,就我而言,
最有效規則就是:管好自己的指標。包括以下幾點:
1:基本保證函數分配的指標在函數結束時被釋放。
(或被某些外部指標引用)
2:如要引用某些傳遞進來的指標,可先Copy一個備份,堅持不修改外部變
量的原則。
3:對於每個指標有個清晰的規劃和說明。