怎么知道寫c語言程序哪里錯誤 C語言小問題,段錯誤是什么?
C語言小問題,段錯誤是什么?1.當(dāng)您訪問未提交的內(nèi)存或非法內(nèi)存時,通常會產(chǎn)生段錯誤。主要問題是程序的內(nèi)存管理。2.其實打開文件就是把文件指針讀入內(nèi)存進行操作。在lz這種情況下,如果文件路徑有問題,就會
C語言小問題,段錯誤是什么?
1.當(dāng)您訪問未提交的內(nèi)存或非法內(nèi)存時,通常會產(chǎn)生段錯誤。主要問題是程序的內(nèi)存管理。
2.其實打開文件就是把文件指針讀入內(nèi)存進行操作。在lz這種情況下,如果文件路徑有問題,就會導(dǎo)致讀取程序中的內(nèi)存出現(xiàn)問題,產(chǎn)生一個斷錯。
3.建議lz搜索關(guān)鍵詞 "內(nèi)存管理和在互聯(lián)網(wǎng)上,然后進一步深入這個問題。
c語言寫程序組件滾動條怎么查看錯誤?
您可以通過在程序中添加調(diào)試語句來定位組件滾動條的錯誤。
c語言編程浮點錯誤怎么解決?
浮點錯誤意味著數(shù)據(jù)類型不匹配。檢查哪種數(shù)據(jù)類型是錯誤的并糾正它是很好的。
C語言程序開發(fā)中,難免會出現(xiàn)邏輯錯誤,怎樣讓程序自己輸出錯誤位置呢?
謝謝邀請我。
在C語言程序的開發(fā)中,程序員經(jīng)常把一個復(fù)雜的任務(wù)分成幾個簡單的子模塊,這些子模塊可以看作是復(fù)雜任務(wù)的各個組成部分。所以程序員可以像 "積木 "來解決復(fù)雜的任務(wù)。
這樣做的原因是,如果您直接編寫C語言代碼來一次性解決復(fù)雜的任務(wù),往往會使整個代碼 "皺巴巴的 ",不僅開發(fā)時容易引入bug,后期維護起來也更痛苦。試想一下,如果把任務(wù)分成幾個子模塊,以后發(fā)現(xiàn)問題可能只需要修改一個子模塊。但是如果你不這樣做。;不要這樣做,你必須從所有的代碼開始尋找并解決問題。哪種開發(fā)風(fēng)格便于維護,相信題主自然明白。
任務(wù)被分成子模塊后,每個子模塊往往被封裝成一個C語言函數(shù),所以最后的 "堆積木材和木材;"實際上是調(diào)用每個C語言函數(shù)。但每個子模塊都可能得到正常結(jié)果或異常結(jié)果,通常用C語言函數(shù)的返回值來區(qū)分。當(dāng)調(diào)用 "堆積木材和木材;"階段,要根據(jù)被調(diào)用函數(shù)的返回值做不同的處理。
例如,當(dāng)一個子模塊負(fù)責(zé)計算用戶輸入的數(shù)字的log(對數(shù))值時,如果用戶輸入一個正數(shù),該子模塊可以得到一個正常的結(jié)果。但如果用戶輸入的是負(fù)數(shù),子模塊顯然無法得到正常的結(jié)果。
下面是一個例子。C語言中的代碼盡可能簡單,以便專注于討論主題:
cond()函數(shù)產(chǎn)生一個從0到10的隨機數(shù)。如果隨機數(shù)小于5,則返回-1(模擬異常結(jié)果),否則返回0(模擬正常結(jié)果)。fun1()函數(shù)和fun2()函數(shù)都會根據(jù)cond()函數(shù)的返回值做一些進一步的工作(上面的C語言代碼跳過 "進一步的工作和).在main()函數(shù)中,當(dāng) "堆疊的木材和木材調(diào)用fun1()和fun2()函數(shù),它使用if語句來判斷它們的返回值,并且并根據(jù)返回值進行不同的處理。
現(xiàn)在編譯這個C語言程序并執(zhí)行它,得到如下結(jié)果:
從輸出結(jié)果中,我們可以發(fā)現(xiàn)C語言程序輸出 "cond是假的(模擬異常)。我們經(jīng)常不 t不想讓程序輸出異常結(jié)果,所以在看到異常結(jié)果后,我們需要知道為什么會出現(xiàn)這個結(jié)果。
適當(dāng)?shù)妮敵鲂畔⒂兄诙ㄎ划惓:蜋z查C語言的源代碼。發(fā)現(xiàn)程序輸出的異常結(jié)果是由于if(!fun1() ampamp!Fun2())為假,但無論fun1()還是fun2()返回-1,if條件表達式都會為假。在這種情況下,main()函數(shù)調(diào)用fun1()和fun2()函數(shù)是不合適的,因為我們可以 這里不繼續(xù)跟蹤異常的原因。似乎main()函數(shù)更合適。相關(guān)的C語言代碼如下。請看:
編譯并執(zhí)行修改后的C語言代碼,得到如下結(jié)果:
這一次,我們知道哪個函數(shù)導(dǎo)致了異常輸出,但是它 寫這么多行代碼太麻煩了,只調(diào)用兩個函數(shù)可能都用不到。如果其他地方需要類似的,it 這就更麻煩了。有沒有更方便的方法?我們嘗試將錯誤消息插入fun1()和fun2()函數(shù),并將fun1()和fun2()函數(shù)的代碼修改如下:
現(xiàn)在在修改前使用main()函數(shù)如下:
編譯執(zhí)行這段C語言代碼并執(zhí)行,得到如下輸出:
這樣,我們不僅可以從輸出中推斷出是哪個函數(shù)導(dǎo)致了異常,還可以保持C語言代碼盡可能的簡單。但是代碼還是有點羅嗦:
這兩個句子的輸出只有fun1和fun2不一樣,但是我們需要把幾乎同一個句子完整的寫兩遍,萬一以后需要修改,兩個地方都要修改,比較麻煩,容易出錯。這種情況可以避免嗎?
在C語言程序的編譯階段使用__FUNCTION__ 、__LINE__ 、__FILE__等關(guān)鍵字,編譯器會將這些關(guān)鍵字解釋為 "函數(shù)名和, "行號 "和 "文件名 "。所以有了這些關(guān)鍵詞,我們就不 不需要手動輸入函數(shù)名。對于本節(jié)中提到的例子,我們可以完全使用上一節(jié)中介紹的define宏定義:
編譯并執(zhí)行這段C語言代碼,得到如下結(jié)果:
可以看到,程序不僅輸出了異常的函數(shù)名,還輸入了函數(shù)所在的文件名(t.c)和行號(lin:26,lin:41)。除此之外,這樣的調(diào)試信息看起來非常舒服,在大型項目開發(fā)中非常實用。
類似的調(diào)試宏包括時間,日期等等,所以我贏了 不要一一演示。
小結(jié)本節(jié)討論在C語言程序的開發(fā)中,復(fù)雜的任務(wù)往往被分成多個子模塊,打包成函數(shù),這些子模塊可能有正常的處理結(jié)果,也可能有異常的處理結(jié)果。所以本節(jié)討論了輸出基本調(diào)試信息對于定位問題的重要性,最后介紹了C語言程序開發(fā)中常用的幾個調(diào)試宏,在大型項目開發(fā)中非常實用。
歡迎在評論區(qū)一起討論提問。這些文章都是手工原創(chuàng)的。每天都有最簡單的C語言、linux等嵌入式開發(fā)介紹。如果你喜歡我的文章,請關(guān)注一波。你可以看到最新的更新和以前的文章。