2009-11-08 82 views
3

GCC 4.4.1,C99size_t是否便攜?

我使用size_tsize_tunsigned int。但是,這取決於您是否正在運行32位或64位。

我將使用size_t來存儲緩衝區的大小。

所以我不認爲這將是非常便攜,如果跨架構使用。

只是一個問題,在32位或64位上使用size_t。什麼情況會導致最嚴重的問題?

回答

6

size_t保證是能夠保持您的實現任何對象的字節數。 這就是爲什麼返回類型sizeofsize_t

所以,是的,它是便於攜帶。

+7

只要您不嘗試將size_t類型變量保存爲二進制文件或通過網絡連接發送,size_t便攜。你開始做的第二件事就是將它作爲一種非常不可移植的東西,它被粘在地板上。 – 2012-06-13 09:30:34

-2

唯一真正嚴重的問題是試圖訪問一個相當大的數組或size_t的大數。

就像一個普通的「int」在64位上可能就足夠了,但是可能會導致32位崩潰,因爲它在32位系統上對於int來說太大了。

1

如果您使用malloc()或read(),對緩衝區使用size_t或ssize_t是有意義的。爲便攜,請使用SIZE_MAX,SSIZE_MAX,sizeof(輸入您的緩衝區)和%zd或%zu printf()。

+0

不幸的是,微軟的C編譯器不支持'z'大小改性劑'的printf()'。 – Novelocrat 2009-11-08 17:03:17

+0

'z'修飾符是C99標準的一部分。迄今爲止,微軟編譯器使用C89/90。在C89/90中,size_t打印的「可移植性」必須手動實現。 – AnT 2009-11-08 17:17:09

+0

那些bas ...,我忘了。那麼,他確實詢問了C99。我猜他確實詢問了「最嚴重」的問題,這個問題可能是Linux的樂觀分配,或者輕率地假設(count * sizeof())不會溢出,或者可能認爲您首先需要分配那麼多內存。 – paul 2009-11-08 17:22:57

0

你不應該認爲size_t是一個無符號整數(see this answer),但我認爲它在兩種架構上都有相同的範圍。

0

取決於你正在使用size_t。

如果使用它來確定內存緩衝區的大小,它將是安全的,因爲size_t足夠大,可以解決任何計算機的整個內存問題。因此,如果內存緩衝區大於此值,則無論如何您都有問題。另一方面,如果將其用作通用無符號整數來計算Universe中的星號數,則可能在32位系統上出現問題(不確定64位系統)。

+0

不正確。 'size_t'足以保存實現支持的最大對象的大小。 'size_t'不足以解決整個內存。對於後者,你需要'intptr_t' /'uintptr_t'。 – AnT 2009-11-08 16:54:24

+0

我站好了。但是,最大的對象就是你在這種情況下可能需要的東西,否則你有另一個問題。 – Jonatan 2009-11-08 16:55:50

1

您還得到了off_t和ptrdiff_t/ssize_t,它們在架構之間以相同的方式不同。

如果您正確使用它們,那麼它們可跨架構移植。在32位系統中,它們都是32位寬,而在64位系統中它們都是64位寬。這就是你想要的 - 在32位系統上,緩衝區的大小不可能大於32位size_t,但在64位系統上它可能會大得多。

你不應該使用整數,長整型或其他任何東西。除此之外,長度的大小取決於平臺(大多數32位系統上的32位,64位Unix系統上的64位,64位Windows上的32位)。

1

在這種情況下很難弄清楚「便攜式」的含義。術語「便攜式」允許多種不同的解釋。

類型size_t有一個非常具體的目的。它可以保存給定實現中的任何對象的大小。即它總是可以接收到sizeof()運算符的結果。類型size_t沒有其他目的,並且在其預期的應用程序中它是100%便攜式的,就像任何東西一樣便攜。

你問的是什麼樣的「便攜式」又一次不清楚。

+0

我正在使用size_t來獲取緩衝區的大小。我使用套接字編程做了一些消息傳遞,源代碼將在Linux和Windows上編譯。我將不得不獲取從客戶端發送的數據的size_t。謝謝 – ant2009 2009-11-08 17:55:31

+0

@robUK,你應該爲你的問題添加這條重要的信息。 – quinmars 2009-11-08 23:33:53

4

正如其他人所說,size_t是正確的,完全可以接受的結果sizeof()或任何可表示的對象的大小以字節爲單位。你有什麼需要注意的是:

  1. size_t,其大小與一些無符號整型相同。它不一定是相同的字節數作爲最大的無符號整數類型,unsigned intunsigned long的等
  2. sizeof(size_t)是如此memcpy實現定義的字節數「荷蘭國際集團,或分配到比其他uintmax_t任何整數類型是餿主意。我甚至不確定是否可以安全地假設它的尺寸相同或比uintmax_t小。
  3. size_t值寫入二進制文件並將其讀取回size_t由另一個進程,在不同的機器上,或通過使用不同的編譯器選項編譯的某些內容可能會危害您的健康。
  4. 通過網絡發送一個size_t值並試圖使用上的另一側的sizeof(size_t)緩衝器以接收這是相當不安全的。

所有這些都是任何其他整數類型的標準問題,除了unsigned char。所以size_t就像任何其他整數類型一樣便攜。