strlen的實現用不用加斷言(assert)?

時間 2021-06-02 15:30:18

1樓:黃亮anthony

換個角度來解釋這個問題,寫應用程式和寫庫,其實並不是一回事。很多庫用到了一些黑暗科技,比如位元組對齊,大部分應用程式不用考慮。反之也是一樣,很多應用程式需要考慮的問題,比如這種assert,在庫里其實不是問題(非空指標應由使用者檢查),或者不能使用(不能主動讓程式崩潰)。

2樓:dyntkj

首先,C語言是「追求速度」的語言,因此任何「沒有必要」的錯誤檢查都被去掉了,甚至有的編譯器都能把strlen直接轉化為一條組合語言指令。

其次,assert巨集只是為了幫助除錯,而標準庫都是經過測試的,即使用了assert,也會在發布前定義NDEBUG,assert就被「遮蔽」了。

最後,即使標準庫把assert加上去了,當你傳入NULL的時候,程式也會崩潰(被abort()),不加assert還是崩潰,那麼還有必要加上assert嗎?

3樓:魯哈花

strlen這種庫函式沒有檢查引數的必要,傳入了NULL進去,崩潰就可以了。記憶體是否可讀、可寫不是由這些函式(strcpy, strcat)內部判斷的,要判斷也要在外部判斷。內部只管處理即可。

4樓:陳碩

assert() 要起作用,要求你自己根據Debug版還是Release版來編譯 strlen() 的原始碼,但是 glibc 是編譯好了的,不受你的編譯選項控制(-DNDEBUG),因此不用加assert。因為加了也沒用。

華為的雲空間到底用不用公升級呢?

區域網優化答疑 來說說華為雲空間的幾個坑 1 不能選擇性備份 2 不能手動資料流量備份 3 強行提示雲空間不足 4 備份時只要wifi斷連備份就會失敗,已上傳的不能保留需要重頭開始什麼傻比設定的備份邏輯?逼著花粉充值購買空間,坑錢不帶眨眼的。建議大家使用外部儲存來進行手機備份。在家用路由器usb插口...

女生用不用改掉自己內向的性格呢

銛嘢 我也是個內向的女生,感覺不用特意去改變,就算改變了,你也會不自在。畢竟那不是真正的你自己,你還是會在乙個人的時候覺得自己是偽裝出來的。內向的人也有很多優點啊,心細,能夠發現很多別人發現不了的細節,有耐心,可以更有毅力地去踏踏實實地做事情。自己對自己自信一點。 徽why168m 在常人眼裡,我們...

倍耐力的輪胎用不用做動平衡?

胡胡 一般換輪胎,建議做動平衡,如果是同時換4條還建議做4輪定位。不管哪個品牌的輪胎,都需要做動平衡。因為輪胎在生產過程中會有輕重點。 Psyyyyy 但凡是輪胎與輪轂分離了或者更換新輪胎 都必須做動平衡 都必須做動平衡 都必須做動平衡 因為重量分布不一樣了 那就需要做重量補償。靠譜的店做動平衡會將...