strcmp需要考慮引數為NULL嗎?

時間 2021-05-30 03:05:41

1樓:

反過來想,為啥標準庫里的 strcmp 版本如此不安全?不光沒檢測 null, 也沒檢測字串長度。

如果檢測,必然需要額外開銷,作為標準庫,作為系統最底層的設施之一,任何一點額外開銷都可能導致系統整體效率的下降,安全和效率在這裡,效率更重要,因此標準庫不額外檢測,反正軟體如果崩潰,你們會 debug,最終會保證傳入引數是正確的。

另外這其實和 C/C++ 的哲學有關,C/C++ 的哲學裡,不一定被使用的東西,在使用前,不應該有開銷。

所以,strcmp 的引數的正確與否,是程式設計師來保證的。就算要檢測,也是加 assert。

但是,如果我們寫乙個並非效率更重要的軟體,那麼額外的引數檢查,可以保證呼叫者犯的錯誤不會被放大。而多年的工作經驗告訴我們,千萬別相信別人,更別相信他們一定是認真研究了你的文件後才來寫程式的,因為我們自己也基本不看文件……

2樓:pansz

不需要,如果是標準庫的話。

因為NULL的值是0,換句話說它實際上是乙個指向0位址的指標而不是空指標。

0位址是否可以讀取資料,取決於系統架構(某些系統架構中0位址是可以正常讀取資料而且必須要正常讀取資料的)。換句話說,在某些系統架構中,如果使用者確實需要比較乙個儲存在0位址的字串,strcmp檢查NULL會導致程式無法正常工作。

0位址資料讀取是系統架構相關的行為,在某些平台上會崩潰,在某些平台上可以正常讀取資料。對於標準庫這個層面的程式設計來說,不能一概的禁止。如果真要處理,建議增加巨集定義,只對已知的特定架構限制NULL。

當然你自己程式設計一般還是需要檢查NULL的,畢竟你自己程式設計通常來說都是面向指定的系統架構。

面試官面試時的問題,我傾向於沒有標準答案。面試僅僅只是考察乙個人解決問題的方式與能力,至於某個題目不符合面試官心中的標準答案,這並不應該造成決定性影響。

-補充:對這一題來說,有乙個顯著的優化是當s1等於s2的時候直接返回0。如果我個人出這道考題的話,如果面試者出於效率的原因不對NULL進行檢查,那麼我可能期待出於效率的原因他對s1==s2的情況進行過優化。

所以你看到,其實面試題的答案,應該是開放的。

3樓:左懶

表示從不考慮過檢驗NULL,不然有時候偷懶不判斷返回值,排查問題都要Debug一下,還不如直接crash掉好用。要麼assert,要麼讓它崩。

4樓:藍色

應該考慮。對於面試,是需要多長乙個心眼的,類似的情況還有就是讓你寫memcpy,你需要考慮記憶體重疊,標準庫也是沒有考慮的。

5樓:

曾經面試時答這個題,就因為考慮了null情況,那xx面試官,還強制告訴我const char *不用考慮NULL,還讓我回去查這個用法

交易小週期大引數和大週期小引數那個好,為什麼?

交易筆記 沒有好壞,只有能不能使用且上手。小週期,大引數可以利用小週期的敏感性觀察到市場的噪音以及任何微小異常,缺點在於對市場比較敏感不易把控,利用大引數則能有一定效果過濾市場噪音帶來的影響,但因為是小週期,在交易過程中還可能被小波動影響導致心理變化過大,長時間不利於個人身心。同樣大週期,小引數可以...

C 函式形參為引用型別時,傳入的引數型別為什麼用引用 的 物件型別和引用型別都可以?

是這樣的 當你給函式形參傳值時,其實上可以理解為用實參初始化形參然後很多的初始化過程都是直接複製 呼叫複製建構函式,但是引用卻不是簡單的複製 其實上可以理解為 int a 實參 int b a 用實參初始化形參 簡直天經地義 573xmcgcg 使用指標或者引用作為形參是為了解決按值傳遞可能導致的問...

怎樣將c 11的function傳入引數為函式指標的c風格API?

using funcType std function funcType func dlsym libHandle,funcName 這樣是不是不可以 funcType func reinterpret cast dlsym libHandle,funcName 這樣呢? How to use a ...