常見的編程錯誤

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

1.提領指向不徹底類型的指針程序員

struct hostentexpress

{編程

       char    *h_name;               ubuntu

       char    **h_aliases;centos

       int     h_addrtype;數組

       int     h_length;緩存

       char    **h_addr_list;服務器

       #defineh_addr h_addr_list[0]app

};

沒有包含頭文件,哈哈

    好比這個結構,儘管在頭文件中已經包含或定義,但對這個結構體的成員(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卸載工具):

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

       二、在註冊表中,找到: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

相關文章
相關標籤/搜索