標籤:地址 錯誤 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),那麼會不會有野指標時,都是會有這錯誤呀。筆者百度了一下,發現這個錯誤跟記憶體有關,那麼野指標不就是指向一個已刪除的對象或未申請訪問受限記憶體地區。
所以這個報錯就是與記憶體相關,所以出現此錯誤時,不妨去檢查與記憶體相關的語句吧。
當然,重要是一個好的編程習慣!!! 定義指標時一定要初始化,野指標的預設值是隨機,它會亂指一通,不管地址是否合法,因此這樣對野指標進行操作很容易造成程式錯誤!!
切記要初始化指標