指標使用注意事項

來源:互聯網
上載者:User

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:對於每個指標有個清晰的規劃和說明。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.