第2章 這不是Bug,而是語言特性

2021-10-23 17:22:08 字數 1395 閱讀 3736

無論在任何時候,如果遇到malloc(strlen(str))幾乎可以斷定它是錯誤的,而malloc(strlen(str)+1)才是正確的,因為字串處理庫函式都包含乙個額外空間,用於容納字串結尾的』\0』字元。

多做之過,就是語言中存在某些不應該存在的特性。這些特性包括容易出錯的switch語句、相鄰字串常量的自動連線、預設全域性作用域

在c語言中,const關鍵字並不真正表示常量,如:

const

int two =2;

switch

(i)

當在switch case語句中 幾乎所有的case都需要以break結尾。

ansi c引入乙個新特性是相鄰的字串常量將被自動合併成乙個字串的約定,這就省掉了過去在書寫多行資訊時必須在行末新增』'的做法。

但這種自動合併意味著字串陣列初始化時,如果不小心漏掉乙個逗號,編譯器不會發出錯誤資訊,而是將兩個字串合併在一起。

定義c函式時,在預設情況下函式的名字是全域性可見的。這個函式對於鏈結到它所在的目標檔案的任何東西都是可見的。如果想限制對這個函式的訪問,就必須加static關鍵字,這樣其成為本檔案可見。

根據實際經驗,這種預設的全域性可見性多次被證明是個錯誤。軟體物件在大多數情況下應該預設地採用有限可見性。當程式設計師需要讓它全域性可見時,應該採用顯式的手段。

c語言中屬於「誤做之過」的特性,就是語言中有誤導性質或是不適當的特性。包括運算子過載(基本無問題),運算子優先順序錯誤(基本無問題)。

輸入函式gets()在新版編譯器中已被警告不要使用。

少做之過的特性就是語言應該提供但未能提供的特性,如標準引數處理以及把lint程式(在unix上的c語言,其把編譯器中所有的語義檢查措施都分離出來。錯誤檢查由乙個單獨的程式完成,這個程式稱為「lint」)錯誤地從編譯器中分離出來。

不要在**中使用/* */進行注釋。

在c語言中,自動變數在堆疊中分配記憶體。當包含自動變數的函式或**塊退出時,它們所占用的記憶體便被**,它們的內容肯定會被下乙個所呼叫的函式覆蓋。這一切取決於堆疊中先前的自動變數位於何處,活動函式宣告了什麼變數,寫入了什麼內容等。原先自動變數位址的內容可能被立即覆蓋,也可能稍後才被覆蓋

最好的解決方案就是要求呼叫者分配記憶體來儲存函式的返回值。為了提高安全性,呼叫者應該同時指定快取區的大小。如:

void

func

(char

*result,

int size)

buffer =

malloc

(size)

;func

(buffer, size);.

..free

(buffer)

;

這不是教程

來到csdn有5年了,在這裡找到不少對我有幫助的博文。但我自己卻不寫,總覺得網上高手那麼多,我會的別人都會,而且寫得也一定比我好。上次折騰了mindjet巨集 的編寫,在csdn搜了搜,好像是沒人寫過,於是我就寫了篇博文。過了2個月,我又想起mindjet了,可當時折騰的過程卻記不清了,回頭看看博文...

這不是放鬆,而是放縱

真是感覺有點可笑,我在突然被某種思緒所觸動的時候總是在深夜,說實話,我挺討厭這樣,因為會讓我整夜睡不著。先說一下近狀吧,離職已經有兩個月了,這兩個月,感覺經歷了不少,但又感覺啥都沒做,為什麼這麼說呢,這兩個月,經歷了沒有面試的焦慮,面試時的答不上題的挫敗,獨自一人遊戲的孤單,沒錢交房租的窘迫,這是我...

這,不是我想要的生活

我理想的工作與生活都是乾乾淨淨 簡簡單單。而似乎現實並不是這樣的。周圍充斥的不純粹,為了保護自己,只好高高豎起尾巴,時刻提防著身邊的點點滴滴。我明白哪些人是在危難時刻會挺身而出,我也明白哪些人會在背後 一刀。但我堅信大家都是有難處,當我對你不滿,斥責時候,不是我在宣洩情緒而是再提醒你,我對你很失望。...