指針的使用心得

  最近與同事合作一項目,雖然負責的內容不算多,但是涉及的也挺廣的。

       其他的話暫時不說,以後再有總結。

       這是我在實際操作中所遇到的問題,可能對很多高手或是基礎好的人來說,不會犯這些錯誤,但是對於我們這些初級菜鳥來說,很容易走進這個陷阱來。造成系統崩潰卻又難於找到原因的情況:不正當使用了指針

        下面是我在實際操作中遇到的問題,這個問題讓我迷茫了好一陣子,今天,靜下心來去仔細查閱了這些資料,終於將問題給解決了,興奮了一會,同時也對指針有了進一步的瞭解。

        過路的大俠勿笑,請飄過~~~~

 

問      題 :

                 系統莫名其妙地死機

 

情況描述:

                 能正常編譯與運行,但不穩定,沒幾下就將系統給弄死機了。死機時,指向的是一個保存錯誤中斷的寄存器。

 

請        教:

                  同事說遇到這個問題有兩種情況,一種是硬件出錯,一種是指針使用不正確,能夠運行說明硬件是沒問題的,應該是你的指針出了問題。

 

跟蹤調試

                  鎖定位置,可是依然沒有辦法解決。但是在調試的過程中,卻發現了一個很重要的現象,指針的內容怎麼實然給更改了,是誰更改了裏面的內容?

 

疑       問:

                 指針出問題?我在聲明的時候已經將所有的都初始化了,有些也態度申請了空間,並做出了判斷,如果有一個沒有申請成功的就會釋放之前申請成功的空間,並返回。沒有申請空間的,都如此初始化:char *p=NULL;爲了防止野指針的出現。(在CSDN論壇上有指針初始化的討論,所有的人都這樣初始化是不恰當的,他們認爲應該這樣初始化:char *p=new char[10];但我認爲這種方法是要開銷內存的

 http://topic.csdn.net/t/20030227/16/1473814.html

理解指針

                 什麼是指針呢?指針有什麼作用呢?裏面保存了些什麼東西?

1,指針是一個佔用4個字節的變量,可以用 sizeof(p)來查看其佔有的空間,暫時得到一個結論是不管什麼類型的指針都是佔據4個字節空間。

2,指針的作用是指向變量的地址,通過變量的地址訪問相應的值。

3,指針本身也有一個地址,叫做指針地址,佔據一定的內存空間,如上面1所說,但是這些不是這個問題關心的事,關心的是,指針裏面到底保存了些什麼東西,保存的是變量地址,也叫做指針的值。要想得到指針的地址、指針的值、指針的值所指的內容(指針所指對象的內容),可以通過以下方法獲得:

char *p=NULL;//初始化指針的值,使其爲0,防止野指針出現,

int i=10;

p=&i;//獲得i的地址,其地址指向的值是10

printf("指針本身的地址:%x\n",&p);

printf("指針的值:%x\n",p); //在此也就是i的地址

printf("指針的值所指的內容:%x\n",*p);//指針所指對象的內容,這裏是10

 

        使用指針所在遵循一個法則,先找到地址(指的是:指針的值),後才能對相應的值操作。

 

        我們常說不能向空指針寫數據,也就是不能向0地址寫數據,但是爲什麼上面的定義又不會錯呢?char *p=NULL;不就是一個空指針麼?是的,這個是空指針,它的值爲0,我們當然不能這樣操作:

char *p=NULL;

  p=5;//此時指針還沒有獲得有效的值,其地址爲0,所以不能向0地址寫數據。

但是可以這樣操作:

char *p=NULL;

int i=10;

p=&i;

printf("i的值:%d",*p);//打印出來的是10

p=5;//此時p已經獲得了i的地址,指針p的值就是i的地址,我們可以通過地址來對i進行操作了

printf("i的值:%d",*p);//打印出來的是5

 

解決問題:

               雖然我已經知道這是我的指針造成系統崩潰,但是找不到是哪個指針出了問題,因爲我已經儘有可能的將“野孩子”(野指針)給扼殺了。

        不知道今天是不是人品突然暴發,竟然在調試的時候又讓我發現了問題的根源,我只是將傳過來的指針參數簡單地賦給了一已經動態申請到空間的新指針:

void(char p)

{

    char *new_p=(char *)malloc(256);

    if(new_p==NULL)

           return;

     new_p=p;//此處沒有將p的所有值寫到new_p的空間裏面

     dosomething();

}

這樣的賦值,並沒有將p的所有值寫到new_p的空間裏面,到下面一使用new_p的時候就會出現亂值。

後來改爲:

void(char p)

{

    char *new_p=(char *)malloc(256);

    if(new_p==NULL)

           return;

   //  new_p=p;//此處沒有將p的所有值寫到new_p的空間裏面

    memcpy(new_p,p,strlen(p));

     dosomething();

}

運行後,系統經得起考驗,哈哈,解決問題

 

總結心得:

 

1,定義指針時,養成初始化指針的習慣,我們可以初始化爲0,防止出現野指針。

 

2,使用char *p=NULL這樣的空指針時,必須先給指針p一個有效的地址空間,然後纔可以對其進行操作,也就是這樣的動作必須配對使用:

char *p=NULL;

p=&a;   //a是一個確定的參數,

 

使用指針操作時必有先初始化。否則容易出現莫名其妙的問題。

 

使用指針所在遵循一個法則,先找到地址(指的是:指針的值),後才能對相應的值操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章