2010-3-30

       今天接觸了數據結構,終於知道那神祕的數據結構長啥樣了!!!嘿....

1】malloc函數

     malloc函數申請內存有不成功的可能,那我們在使用指向這塊內存的指針時,必須if(NULL!=p)語句來驗證內存確實分配成功了。malloc兩次只free一次會內存泄漏,malloc一次free兩次肯定會出錯。內存釋放之後最好重新把p=NULL;否則,free(p)之後,

if(NULL!p)這條檢測語句將會失效。

2】編程風格:

     用縮行顯示程序結構,是排版整齊,縮進量統一使用4個字符。

3】錯誤總結:

     今天在寫一個順序表插入操作函數是犯了個經常容易犯的錯誤,如:

                          typedef int datatype;

                          typedef struct

                          {

                                 datatype data[10];

                                 int last;

                          }sqlist,*sqlink;

                          int Createlist(sqlink link)

                          {

                                 link=(sqlink)malloc(sizeof(sqlist));

                                 if(link==null)

                                       return 0;

                                  else

                                       return 1;

                          }

                          int main()

                         {

                                  sqlink plink;

                                  datatype mdata;

                                  if(Createlist(plink)==1)          

                                      printf("success");

                                  else

                                      printf("fail");

                                 ......

 

                         }

      高手一看就知道我犯了個低級錯誤,我將plink傳個形參link,是形參link指向我malloc的一塊內存,注意:此時是形參link指向了堆區的一塊內存,而plink指向的仍是一片未知的區域。當Createlist函數結束後,棧中的link釋放了,從而造成了內存泄漏。

      解決方法有兩個:

      1/首先修改傳進的參數爲指針的地址----

                                int Createlist(sqlink *link)

                               {

                                     *link=(sqlink)malloc(sizeof(sqlist));

                                     if(*link==null)

                                         return 0;

                                     else

                                        return 1;

                                }

                                ....

                                if(Createlist(&plink)==1)

                                ....

        2/返回一個分配的內存地址:

                                sqlink Createlist(sqlink link)

                                {

                                      link=(sqlink)malloc(sizeof(sqlist));

                                      if(link==null)

                                           return link;

                                      else

                                           return NULL;

                                }

這樣問題解決了,豈不痛哉。。。。

4】scanf函數小問題

     以前不怎麼注意,這函數還真有些小陷阱在裏面。

     如:

                     int mdata;

                     scanf("%d",&mdata);

                     printf("%d",mdata);

                     scanf("%d",&mdata);

                     printf("%d",mdata);

      如果第一個scanf輸入的參數不是int型,第二個scanf將直接輸出...等。。大家可試試。。

      分析詳見:

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章