今天,在寫順序棧時,開始形參傳遞的是經過取地址,就是用 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 時就異常退出。測試
什麼問題呢?因而我按照個人寫法簡單寫了個測試程序。spa
#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), 那麼其它的呢,因而又寫了個程序來測試.code
#include <stdio.h> int main() { int *a, b; //b = 100; //a = &b; printf("%d", *a); }
運行後,一樣是返回錯誤 Process returned -1073741819 (0xC0000005),那麼會不會有野指針時,都是會有這錯誤呀。筆者百度了一下,發現這個錯誤跟內存有關,那麼野指針不就是指向一個已刪除的對象或未申請訪問受限內存區域。
對象
因此這個報錯就是與內存相關,因此出現此錯誤時,不妨去檢查與內存相關的語句吧。blog
固然,重要是一個好的編程習慣!!! 定義指針時必定要初始化,野指針的缺省值是隨機,它會亂指一通,無論地址是否合法,所以這樣對野指針進行操做很容易形成程序錯誤!!內存