1. 程式人生 > >C語言編譯常見錯誤解析

C語言編譯常見錯誤解析

C語言編譯錯誤資訊及說明
1、 在函式 ‘transform’ 中:7: 錯誤:expected ‘;’ before ‘{’ token
    解釋:‘{’之前的某個語句缺少分號‘;’;
 
2、 在函式 ‘Insert_SqList’ 中:6: 錯誤:‘listsize’ 未宣告 (在此函式內第一次使用)
    解釋:‘listsize’這個變數未宣告;
 

3、 在函式 ‘Hanoi’ 中:9: 錯誤:提供給函式 ‘Hanoi’ 的實參太少
    解釋:使用‘Hanoi’函式時,輸入的實參不足;
 
4、 在函式 ‘max’ 中:3: 錯誤:‘a’ 被重新宣告為不同意義的符號
    解釋:在函式‘max’中,變數名a被重新宣告為不同的變數型別;
 
5、 在函式 ‘EvaluateExpression’ 中:7: 錯誤:程式中有遊離的 ‘#’
    解釋:在函式‘EvaluateExpression’中,有不可識別的ASCII字元。一般這種情況是由於將程式碼複製進程式碼區時,有一些編譯器不能識別的字元也被複制進去,導致的編譯錯誤;
 
6、 在函式 ‘encode’ 中:6: 錯誤:被呼叫的物件 ‘code’ 不是一個函式
    解釋:在函式‘encode’中,呼叫‘code’時發現,code並未宣告為一個函式;
 
7、 在函式 ‘prime’ 中:6: 錯誤:在 C99 模式之外使用 ‘for’ 迴圈初始化宣告
    解釋:在函式‘prime’中,呼叫for迴圈的格式不符合C99規範。一般這類問題的錯誤格式為for(int i=0;i<...),由於C語言是要求你必須將變數在函式開始處進行宣告,不支援在任意地方宣告變數,所以正確的格式應該是int i;...;for(i=0; i<...);
 
8、 21: 錯誤:expected identifier or ‘(’ before ‘}’ token
    解釋:在‘}’之前缺少一個識別符號或‘(’;
 
9、 在函式 ‘CreatLink_L’ 中:14: 錯誤:賦值時型別不相容
    解釋:在CreatLink_L函式中,在賦值的過程中等號兩側的資料型別不相容;
 
10、段錯誤
    解釋:一般來說,段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間,通常這個指是由gdtr來保持的,他是一個48位的暫存器,其中32位是儲存 由它指向的gdt表,後13位保持對英語gdt的下表,最後3位包括了程式是否在記憶體中以及程式的在cpu中執行的級別,指向的gdt是由以64位為一個 單位的表,在這張表中就儲存著程式執行的程式碼段以及資料段的起始地址以及與此相應的段限和頁面交換還有程式執行級別還有記憶體粒度等等的資訊。一旦一個程式 發生了越界訪問,cpu就會產生相應的異常保護,於是segmentation fault(段錯誤)就出現了。出現段錯誤比較常見的情況是訪問不安全的指標物件,即指標所指的值並非預期的值時,對指標所指向的物件進行操作。引發段錯 誤後,程式執行終止,之後的程式碼將不再執行;
 
11、在函式 ‘ListInsert_Sq’ 中:12: 錯誤:‘SqList’ 沒有名為 ‘Length’ 的成員
    解釋:在函式‘ListInsert_Sq’中,訪問的結構體‘SqList’並沒有‘Length’這個成員;
 
12、在函式 ‘ReverseList_Sq’ 中:11: 錯誤:陣列下標不是一個整數
    解釋:在函式‘ReverseList_Sq’中,訪問陣列成員時使用的下標不是整數。陣列中標識每個元素都有一個整形下標,實際操作中是在陣列基址的基礎上加上這個整形下標得出儲存對應陣列元素地址,然後訪問這個地址儲存的資料;
 
13、在函式 ‘dec_to_oct’ 中:10: 錯誤:實參 1(屬於 ‘Push_Sq’)型別不相容
    解釋:在函式‘dec_to_oct’中,呼叫函式Push_Sq時,輸入的第一個實參型別與函式指定的第一個實參型別不相容;
 
14、在函式 ‘GetTop’ 中:7: 錯誤:在非結構或聯合中請求成員 ‘top’
    解釋:在函式‘GetTop’中,在訪問結構體或聯合體內的成員變數‘top’時,發現訪問的變數型別並非是一個結構體或聯合體;
 
15、在函式 ‘score’ 中:5: 錯誤:case 標號不能還原為一個整常量
    解釋:在函式‘score’中,case標號後跟著的表示式的值並非一個常量值。C語言對於switch語句的語法規定,要求switch後面的括號內為 一個表示式。其值應與某一個case後面的常量表達式的值相對應,然後就執行此case後面的語句。這就意味著在case語句之後必須是一個整形常量,並 且在C編譯器中要求這個常量表達式的值還必須是一個整形值;
 
16、5:23: 警告:多位元組字元常量 在函式 ‘transform’ 中:
    解釋:對字元變數賦值應對應一個字元常量,如char c = 'c'。如果將多個字元常量賦給一個字元變數時,如char c = 'abc',就引發多位元組字元常量警告;
 
17、在函式 ‘transform’ 中:3: 警告:隱式宣告與內建函式 ‘strlen’ 不相容
    解釋:在程式中使用字串函式strlen時未include<string.h>。我們的系統希望使用者能自行實現一些功能程式碼,而不是呼叫庫函式。必須要使用庫函式的地方,我們會在呼叫後程序時匯入include語句;
 
18、6: 錯誤:‘prime’ 重定義3: 錯誤:‘prime’ 的上一個定義在此
    解釋:prime函式重定義;
 
19、在函式 ‘leap_year’ 中:3: 錯誤:賦值運算中的左值無效
    解釋:賦值操作符‘=’的左端的值為左值(l_value),對應右側的值為右值(r_value)。左值的要求是可定址的(l的意思為can be though of as location,而不是left),一般是變數。右值的要求是可讀的(r的意思為can be though of as "read" value,而不是right),可以是變數和常量;
 
20、在函式 ‘IntersectList_Sq’ 中:18: 錯誤:雙目運算子 * 運算元無效
    解釋:雙目運算子‘*’的運算元不滿足運算子的要求,或者說兩個運算元不能發生指定的雙目運算;
 
21、在函式 ‘ListInsert_DuL’ 中:8: 警告:初始化時將整數賦給指標,未作型別轉換
    解釋:初始化指標變數時,將整型數值賦給該變數,引發的型別不匹配警告;
 
22、在函式 ‘DerivationPolyn’ 中:7: 錯誤:無效的初始值設定
    解釋:初始化變數時使用不相容的右值來初始化左值,往往會引發這種錯誤;
 
23、在函式 ‘cmpterm’ 中:7: 錯誤:‘->’ 的實參型別無效
    解釋:‘->’的指向的結構體或聯合體成員名不存在,即在訪問指標指向的結構體型別中不存在的成員時,會引發這種錯誤;
 
24、在函式 ‘lineEdit’ 中:15: 警告:傳遞引數 2 (屬於 ‘Pop_Sq’)時將整數賦給指標,未作型別轉換
    解釋:在函式‘lineEdit’中,呼叫函式Pop_Sq時要求第二個引數為指標變數,而輸入的引數為整型;
 
25、在函式 ‘ListInsert_DuL’ 中:8: 警告:從不相容的指標型別初始化
    解釋:在函式‘ListInsert_DuL’中,為指標變數初始化值時,右值與指標型別不相容;
 
26、在函式 ‘ReverseList_Sq’ 中:8: 錯誤:與 ‘pa’ 型別衝突
    解釋:可能對變數‘pa’使用了其型別不支援的操作。或者將‘pa’變數賦給不同型別的變數或重定義該變數;
 
27、8:9: 錯誤:空的字元常量
    解釋:C的字元常量是用單撇號括起來的一個字元。如'a','x','D','?','$'等都是字元常量。但注意''並不表示一個字元常量。如果訪問'',就會引發空字元常量錯誤;
 
28、在函式 ‘MergeList_Sq’ 中:18: 警告:在無返回值的函式中,‘return’ 帶返回值
    解釋:void函式為無返回值的函式。這就意味著函式中使用‘return’語句時,之後不能跟有返回值;
 
29、在函式 ‘rabbit’ 中:3: 錯誤:可變大小的物件不能被初始化
    解釋:這種錯誤一般發生在用變數作為陣列大小來初始化陣列變數;
 
30、在函式 ‘days’ 中:4: 警告:標量初始值設定項中有多餘元素
    解釋:在函式‘days’中,在初始化某個陣列時,初始化的元素個數多於定義時的元素個數;
 
31、13:39: 錯誤:數字中有太多小數點
    解釋:數字常量中有太多小數點,不符合數字常量的定義;
 
32、3:9: 錯誤:整數常量的“f”字尾無效 在函式 ‘bonus’ 中:
    解釋:“f”字尾只能新增在實型常量之後,加在整型常量後就會引發該錯誤;
 
33、在函式 ‘count_words’ 中:7: 錯誤:‘c’ 重宣告為沒有外部連結
    解釋:在函式‘count_words’中,宣告一個新的變數時,使用了已經存在的某個變數的名稱來命名新的變數。C程式在開始執行函式後,首先會根據變 量名和變數型別為宣告的變數分配儲存空間,這就要求所有的變數的名稱必須在本函式內是唯一的。任何對同一個變數名的重新宣告都將是為錯誤;
 
34、在函式 ‘bonus’ 中:7: 錯誤:break 語句不在迴圈或開關語句內
    解釋:break語句的功能是用來跳出switch結構和迴圈體,即提前結束迴圈接著執行迴圈下面的語句。因此C語言要求break語句不能用於迴圈語句和switch語句之外的任何語句中;
 
35、在函式 ‘prime’ 中:5: 錯誤:自增運算中的左值無效
    解釋:在函式‘prime’中,呼叫自增操作符時,操作的物件不符合左值要求;
 
36、在函式 ‘GetElem_L’ 中:14: 錯誤:下標運算的左運算元既非陣列也非指標
    解釋:下標運算子(或變址運算子)'[]'要求操作符左側的變數名必須是陣列名或指標;
 
37、在函式 ‘Insert_SqList’ 中:7: 錯誤:expected declaration or statement at end of input
    解釋:多數是由於少了匹配的大括號造成的,當然小括號沒有閉合也有可能!編譯的時候找到檔案的末尾也沒有找到該出現的東西;
 
38、在函式 ‘count_words’ 中:3: 警告:從不相容的指標型別初始化
    解釋:在函式‘count_words’中,用非指標型別的值來初始化指標型別變數;
 
39、在函式 ‘ListInsert_Sq’ 中:6: 錯誤:在 ‘data’ 中缺少陣列大小
    解釋:在函式‘ListInsert_Sq’中,宣告名為data的陣列時,沒有給出陣列的大小,如語句char data[];
 
40、在函式 ‘days’ 中:5: 錯誤:重複的 case 常量
    解釋:在函式 ‘days’中,發現了重複出現的case常量。switch/case語句要求每一個case的常量表達式的值必須互不相同,否則就會出現互相矛盾的現象(對錶達式的同一個值,有兩種或多種執行方案)。