切記要初始化指標

來源:互聯網
上載者:User

標籤:地址   錯誤   address   ini   RoCE   turned   測試程式   初始   highlight   

  今天,在寫順序棧時,開始形參傳遞的是通過取地址,就是用 SeqStack &S 傳遞,後來看到網上有用指標來傳遞的,於是想來改成用指標傳遞。

  問題來了,當我把所有的 S.top  S.data 修改為 S->top S->data 、SeqStack &S 修改為 SeqStack *S 運行時,用的是 codeblocks ,運行並未報錯,可是不列印出棧中元素,運行一會就返回 Process returned -1073741819 (0xC0000005) 錯誤退出。為了找到具體報錯位置,我挨個加了 printf() 發現了問題所在,就是只要運行到有 S->top 或 S->data 就異常退出。因為棧要初始化,所以執行到 InitStack(SeqStack *S) 下的 S->top = -1 時就異常退出。

  什麼問題呢?於是我按照我的寫法簡單寫了個測試程式。

#include <stdio.h>typedef int DataType;typedef struct{    DataType data;    int top;}SeqStack;int main(){    SeqStack *S;    // 去掉注釋程式就正常運行 輸出 100 1   // SeqStack address;   // S = &address;    S->data= 100;    S->top = 1;    printf("%d %d ", S->data, S->top);}

  問題就在有沒有給定義的指標初始化。那要怎麼去判斷有指標沒有初始化呢?

  下面是筆者的想法,在 codeblocks 運行時退出返回的是 Process returned -1073741819 (0xC0000005), 那麼其它的呢,於是又寫了個程式來測試.

 

#include <stdio.h>int main(){    int *a, b;    //b = 100;    //a = &b;    printf("%d", *a);}

 

  運行後,同樣是返回錯誤 Process returned -1073741819 (0xC0000005),那麼會不會有野指標時,都是會有這錯誤呀。筆者百度了一下,發現這個錯誤跟記憶體有關,那麼野指標不就是指向一個已刪除的對象或未申請訪問受限記憶體地區。 

  所以這個報錯就是與記憶體相關,所以出現此錯誤時,不妨去檢查與記憶體相關的語句吧。

  當然,重要是一個好的編程習慣!!! 定義指標時一定要初始化,野指標的預設值是隨機,它會亂指一通,不管地址是否合法,因此這樣對野指標進行操作很容易造成程式錯誤!!

  

切記要初始化指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.