2011-04-19 62 views
1

In C:
我的字符串長度函數返回一個size_t值?strlen要返回size_t?

爲什麼它不返回一個常規的整數?還有一件事我注意到,當我試圖用另一個字符串concat這個字符串時,我在運行程序時收到了一個總線錯誤。

背景:我很喜歡玩gmp庫,並將大數字轉換爲字符串,我最終得到了上述情況。

是什麼樣的字符串呢?我的操作系統在這個問題上扮演什麼角色?我使用MAC,64位操作系統。

編輯:我收到的錯誤,MSG爲:警告:格式「%d」需要鍵入「詮釋」,但參數3的類型爲「爲size_t」

謝謝!

@all:謝謝你的回答,但我想我會把巴士錯誤作爲另一個問題,因爲它似乎是一個不同的問題。

+0

'size_t' _is_是一個整型數據類型。總線錯誤很可能與此無關,你可能只是簡單地使用一個緩衝區,在某個地方有一個懸空/空指針或者其他的東西。 – Mat 2011-04-19 13:07:32

+0

@Mat整數部分現在已經澄清,但總線錯誤正在爲任何程序使用兩個字符指針使用strcat常見。 – Maverickgugu 2011-04-19 13:24:11

+0

爲此特意打開一個新問題,用一些代碼片段來展示如何使用'strcat'。 – Mat 2011-04-19 13:26:43

回答

4

問題是int可能不夠寬,不足以存儲整個可能的長度值範圍。例如,在64位上,可以使用長度超過4 GB的字符串,如果int是32位,則不可能通過int變量返回長度較長的字符串。

3

POSIX strlendoes return size_t

至於什麼導致了總線錯誤,不可能說沒有看到代碼和知道更多關於您的更改的確切性質的詳細信息。一種可能是你導致了一個緩衝區溢出或者做了一些你不應該做的NULL指針。

+0

@sharptooth:謝謝你!關於如何調試總線錯誤的任何想法? – Maverickgugu 2011-04-19 13:13:54

+0

@Maverickgugu:在gdb中運行程序或查看核心轉儲可能是一個好的開始。 – NPE 2011-04-19 13:15:20

3

strlen()總是返回size_t ...並且POSIX標準也是這樣說的。

我猜的原因是int有符號,並且即使是一個unsigned int的容量可能不足以保存一個元素的大小(例如,如果你有一個32位int在x86-64與16GB RAM)...這個例子是極端的,但可能的。

2

strlen返回一個size_t,因爲至少ISO C90 - 我只是檢查了我的副本。這個標準應該與ANSI C89沒有技術上的區別。

有一個約定的變化(size_t不是在K & R C),但它是很久以前。

+0

謝謝!我現在才意識到它.. 建議給ISO-C90一個完整的閱讀。或者在問題出現時用它作爲參考! – Maverickgugu 2011-04-19 13:37:59

2

爲了解決您的警告(這實際上是一個錯誤 - 你已經通過傳遞了錯誤的類型來調用printf未定義行爲),你應該使用%zu而不是%d打印size_t值。

+0

是的..我意識到size_t可以使用%ld打印..但%zu也似乎是不錯的選擇。謝謝! – Maverickgugu 2011-04-19 13:35:31

+3

'%ld'不一定正確。實際上,它會在大多數32位系統上發出警告,其中'size_t'被定義爲'unsigned int' - 即使這裏的類型大小相同,'unsigned int'和'unsigned long'仍然不是相同的類型*。 – 2011-04-19 13:39:35

1

有一個非常簡單的和邏輯的原因,所有的標準庫中的功能與size_t工作,當涉及到內存塊的長度 - 內置sizeof運營商產生了size_t結果也是如此。

此外,size_t是無符號,一個特定的大小,依賴於架構的,是不僅僅是一個普通的int這是指用於存儲從各地辦公室的樹木計數的任何數量的,對你的聲譽語義不同。

+0

我不知道'int'確保足以存儲SO代表。它不能保證至少可以存儲'-32768'到'+ 32767'嗎? :p – Thomas 2013-12-20 05:00:36

+0

@Thomas _int的最小範圍是-32767至+32767 C11§5.2.4.2.1。 – chux 2014-03-04 23:00:58