常見的編程錯誤


編程不經歷錯誤或警告,怎能見彩虹,沒有人能隨隨便便成為高手。身為程序員的我們,如果哪一天沒有了錯誤或警告的提示,一定會有一種不祥的預感,對吧,都懂的抓狂。編程N年來,碰到過的問題多得自己都記不清了,你也一樣,如果可以選擇,我願時光倒流,真希望都能記下來,現在就可以寫本《錯誤集》了,偷笑。下面是我心情好時,有想法時,隨手記下的幾個錯誤或警告,遺憾的是,這些年,就記下那么幾個而已,見笑了,希望能給像我一樣在路上的人有些幫助或提示。

1.提領指向不完全類型的指針

struct hostent

{

       char    *h_name;              

       char    **h_aliases;

       int     h_addrtype;

       int     h_length;

       char    **h_addr_list;

       #defineh_addr h_addr_list[0]

};

沒有包含頭文件,哈哈

    比如這個結構,盡管在頭文件中已經包含或定義,但對這個結構體的成員(hptr->h_name)變量進行訪問時,編譯無法通過,顯示編譯器錯誤提示為“提領指向不完全類型的指針”。

對於結構體來說雖然所有的變量默認都是公有的,但是,如果想訪問里面的成員變量,必須有包含對其結構的定義,否則出現如上的錯誤,c編譯器將無法識別結構里面的變量,一般想操作結構體里的成員變量,都是通過調用結構體中定義的函數接口,來取得結構體中的值,如果想直接訪問,在頭文件或源文件中加入結構體的定義就行了

2.警告:賦值 makes pointer from integer without a cast

同樣因為沒包含頭文件。


3.previous implicitdeclaration of 'Base64_Code' was here

    Base64_Code函數未定義,如果要使用 Base64_Code函數,則要先定義。


4.警告:use of cast expressions aslvalues is deprecated

(short)buf[2] =atoi(&data[4]);不贊成把強制類型轉換的結果作為左值


5.warning: initializationdiscards qualifiers from pointer target type

initialization取消了指針目標類型的限定。


6.glibc detected *** free():invalid next size (normal)

    是內存泄露的問題。

    (1)一般是free了沒有分配的內存

    (2)還有就是分配了內存忘記釋放也有可能會出現這樣的問題。

    (3)最后查出來是數組循環的時候越界了 , 寫到了其他的內存里面, 然后一free那個區域就出現了這樣的問題。

    是有allocate引起的,一個debug的方法是把你懷疑的矩陣(比如釋放了就會報內存錯誤)定義成靜態的,這樣如果出現越界,會報段錯誤。依次檢查是否你的數組真的越界了。

7. undefined referenceto `__gxx_personality_v0'

    gcc main.c animal.o后,出現這個錯誤(c與c++混合編程中),解決:gcc main.c animal.o -lstdc++   錯誤原因:是因為你用gcc編譯.cpp文件.按系統默認.cpp文件是c++的文件格式


8.rmmod:gpio_i2c_LVP1008.ko: Resource temporarily unavailable

    [root: 1st]#lsmod //查看一下當前加載的模塊

    driver 1256 0- Live 0xbf00c000

    device 1560 0- Live 0xbf006000

    bus 1336 2driver,device, Live 0xbf000000 //模塊的引用計數,bus模塊被device和driver引用

    [root: 1st]# rmmodbus //如果你要卸載bus模塊,它會提示出錯,要先卸載driver和device

    rmmod: remove'bus': Resource temporarily unavailable

    [root: 1st]#rmmod driver

    usb driverbye!

    [root: 1st]#rmmod device //卸載device時,內核自動調用device結構體中指定的release函數

    <kernel>release

    usb device bye!

    [root: 1st]#lsmod //bus的引用計數為0,可以卸載bus了

    bus 1336 0 -Live 0xbf012000

    [root: 1st]#rmmod bus

    usb bus bye!

9. error: expectedidentifier before numeric constant錯誤。

     原因:定義的enum結構體與其它處的宏定義有沖突。

10.warning: missing bracesaround initializer

    原因:結構體初始化失敗。

11.too many agrument

    一種原因:參數多於10個。

12. /usr/bin/ld: cannot find-lxxx

    原因:找不到對應庫文件。其中,-lxxx表示鏈接庫文件 libxxx.so。

    一般出現這種錯誤有以下幾種原因:

        1.系統缺乏對應的庫文件;

        2.版本不對應;

        3.庫文件的鏈接錯誤;

        4.庫文件路徑設置問題。

     對應第一第二種情況,可以通過下載安裝lib來解決,ubuntu大多數可以直接通過apt-get來安裝:

       apt-get install libxxx-dev

      一般遇到這種問題筆者第一時間也是會去檢查系統是否已安裝該lib或者是否已選擇正確版本(只是習慣問題),如果還是不能解決問題,那么,引起錯誤的原因不是鏈接錯誤就是庫文件路徑問題了。

        通過find或者locate指令定位到鏈接文件,查看鏈接文件是否正確的指向了我們希望的lib,如果不是,用ln -sf */libxxx.so.x */libxxx.so 指令修改它。

        如果是庫文件路徑引發的問題,可以到/etc/ld.so.conf.d目錄下,修改其中任意一份conf文件,(可以自建conf,以方便識別)將lib所在目錄寫進去,然后在終端輸入ldconfig 更新緩存。

13.在控制台提示:Semop lock failureIdentifier removed

   Semop unlock failure Identifier removed

  解決辦法:運行應用程序,比如:client-qws& 去掉-qws 因為只有Server 才需要 -qws&。&為后台運行的標識。

14.Segmentation fault

    數組越界或訪問空、野指針或未被初始化的指針都會出現這個問題。

15.安裝VMware: The MSI'C:\Users\dell\AppData\Local\Temp\vmware_1344246656\vmwarevmcisockets64.msi'failed

    清空注冊表中vmware信息(或者下載一個VM卸載工具):

       1、開始->運行,輸入:regedit;

       2、在注冊表中,找到:HKEY_LOCAL_MACHINE\SOFTWARE\VMware並刪除。

VMware Workstation unrecoverable error:(vmx)錯誤

解決:刪除或修改虛擬機目錄下拓展名為.vmss(33.3M)文件,再次啟動即可。 一般為centos5.6-d4cf3290.vmss文件。

16.arm板運行時出現Can't retrieve login name 

    原因:RTP的JRTPLIB庫中的RTPSession中的Create->InternalCreate->CreateCNAME中,有對用戶名進行一定操作,其中的getlogin_r(),getlogin()和getenv()操作都會因為用戶名為空,而返回錯誤 ERR_RTP_SESSION_CANTGETLOGINNAME。
解決的方式有3種:1)export   LOGNAME=root  2)大部分開發板還是需要用戶名登陸的,即在文件系統完全啟動后再運行,也能解決。 3)因為板子上的文件系統有時不需要用戶名就可以直接登錄,而在我們可以通過修改JRTPLIB庫的CreateCNAME源代碼來為系統默認設置一個用戶名。在RTPSession.cpp的第1400行。

17. warning: control reaches end of non-void function
    解決:函數結尾無return返回值導致的,在函數最后加一句return 0。
18.could not read symbols: 文件格式錯誤
19.insmod: can't insert 'xxx.ko': unknown symbol in module, or unknown parameter
    解決辦法:通過信息中的綠色背景信息,可以找到解決辦法:在內核模塊源碼文件中添加MODULE_LICENSE("GPL");
20.MMB LEAK(pid=2876): 0xC68B9000, 32768 bytes, '' mmz_userdev_release: mmb<0xC68B9000> mapped to userspace 0x40f50000 will be force unmaped!
    解決:客服端跟服務器端進行socket通信時,服務器異常斷開,而客戶端並不知道服務器已經斷開,繼續向服務器發送數據,從而引發了SIGPIPE信號,內核響應這個信號,強行終止了程序;
    #include <signal.h>    signal(SIGPIPE, SIG_IGN);
    還有一種可能就是代碼中循環判斷嵌套層次達到四次,被GCC編譯器優化后運行時會出現這種錯誤。只要降低循環判斷嵌套層次即可。
21.mount: 192.168.1.211:/work/nfs failed, reason given by server: Permission denied
1)修改 /etc/exports
/work/nfs   192.168.1*(rw,insecure,sync)   //網段不對
2)然后重啟服務
service nfs restart
22. 開發板能ping通路由器,但ping不通外網
   vi /etc/resolv.conf
    nameservice 192.168.2.1
    因為1,2網段不斷切換,但域名服務器未改變。

 

    我想,錯誤不在於多寡以及自己筆記記下了多少,而是在於能養成一種良好的習慣,編程以邏輯為重,比如最為簡單的if(0 == i),錯誤的鎖定及調試手段#define _DEBUG(msg...)    printf("[ %s,%s, %d ] ",__FILE__, __FUNCTION__, __LINE__);  printf(msg);printf("\r\n")等等等等…………

    注:本文經過整理,轉載自http://blog.csdn.net/sbvfhp/article/details/9239531


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM