C語言中的技術陷阱

2021-07-10 12:12:34 字數 1908 閱讀 8038

c語言深入學習階段,我正在讀《c語言程式設計之道》這本書,整理了c語言中的一些技術陷阱。這本書上的封面上有一句話我覺得挺有道理——「每多學一點知識,就少寫一行**」,知識便是財富。

一、c語言中的識別符號是區分大小寫的

這是很基本的問題,初學者也很容易忽視。

二、」{}」與」」的混淆使用

例如:

int main()

;}

本想定義二維陣列並初始化依次賦值為1,2,3,4,5,6。然而事實上的賦值結果為3,6,0,0,0,0, 原因是()的使用,()運算子等級最高,優先計算裡面的式子,特別注意的是逗號也是運算子,運算結果為最後乙個表示式的值,即分別為3和6,其他則沒有賦值,預設值為0。

所以應該改為:int a[2][3] = , };

三、使用迴圈語句不當,產生死迴圈

例:

unsigned int a;

for(a = 10; a >= 0; a--)

這個程式編譯執行的話便會產生死迴圈,不斷列印數值。原因是變數a的定義問題,a被定義為無符號變數,必然滿足a>=0。應該將unsigned去掉,定義a為有符號變數。

四、do…while 和 while的區分

do…while先執行再判斷,while先判斷再執行。

五、資料溢位

為了防止溢位,定義變數時可以選擇範圍更廣的資料型別,比如int型換成long型,但同時也會降低運算速度,儘量減少使用。

六、輸入資料忘記新增取位址符&

例:

int a;

scanf("%d", a);

scanf輸入資料應該使用位址,即應該改為&a。

七、scanf輸入格式不符

格式控制中沒新增任何符號則可以使用空格、enter鍵、或tab鍵進行間隔。

注意:

1、使用錯誤的格式輸入資料,不會產生錯誤提示,但沒有輸入正確的資料。

2、「格式控制」中使用的英文或中文的逗號要區分。

八、輸入資料的型別不符

scanf中%c格式連續輸入字元,且格式控制中沒加任何符號時,執行時不能使用空格作為間隔符。因為空格本身會被當做字元輸入。

九、switch語句中break的使用不能忘記。

十、指標沒有被初始化

指標需要指向某個位址,才具有實際的意義,如變數的位址、陣列的首位址等。

宣告指標時,若不立即初始化,最好先初始化指向null,防止誤指,產生不必要的錯誤。

十一、超出動態分配的記憶體

malloc函式在記憶體動態儲存區分配指定長度的連續空間,返回void型的起始位址。

十二、使用記憶體後未釋放

malloc函式使用後要用free函式釋放空間。

十三、記憶體釋放後就不能再被使用

例:

char *str = malloc(20);

strcpy(str, "goodluck");

free(str);

printf("%s\n", str);

執行會出錯,應當將釋放操作放到最後,最好再加上str = null。

十四、沒有宣告所使用的函式的標頭檔案

十五、忽略字串結束符

例:

char *or_str = "hello world!";

char *cp_str = malloc(strlen(or_str));

strcpy(cp_str, or_str);

strlen函式計算的長度不包含結束符』\0』,但strcpy函式複製時系統會自動給字串加結束符。所以分配的長度應該加一,即char *cp_str = malloc(strlen(or_str) + 1);

十六、定義陣列長度使用變數

定義陣列的長度應該使用常量。

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...

C語言中strlen方法的陷阱

在用strlen時遇到挺鬱悶的問題,用strlen求字元陣列的長度時總是不對,google了一下才發現忽略了其中的一些細節。int main 在我的機器上執行結果總是26,但明顯應該是5,why?看了下strlen的原始碼才明白,strlen判斷字串長度時是以 0 為界的,也即strlen碰到 0 ...