59

我想在C中打印出一個類型爲size_t的變量,但看起來size_t在不同的體系結構中被別名爲不同的變量類型。例如,一臺機器上(64位)以下代碼不會引發任何警告:平臺無關size_t c中的格式說明符?

size_t size = 1; 
printf("the size is %ld", size); 

但我的另一臺機器上(32位)的上面的代碼產生以下警告消息:

警告:格式「%ld的」需要鍵入 「長整型*」,但爭論3的類型爲 「爲size_t *」

我懷疑這是由於指針大小的差異,讓我64位機器size_t被別名爲long int"%ld"),而在我的32位機器size_t上被別名爲別的類型。

是否有專門針對size_t的格式說明符?

+0

您的警告信息與代碼不符。警告提到指針,你的代碼沒有任何。你有沒有刪除一些'&'的地方? – Jens 2012-04-17 14:38:34

+0

指針?不,我沒有得到關於指針的任何警告,實際上取決於我運行該代碼的機器有時根本沒有任何警告。請嘗試以下測試代碼: #include int main(){ size_t size = 1; printf(「尺寸爲%ld」,尺寸); return 0; } – 2012-04-17 16:39:07

+1

另請參見[跨平臺格式字符串的變量類型size_t?](http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size-t) 。 – legoscia 2012-09-21 10:10:18

回答

87

是:使用z長度修改:

size_t size = sizeof(char); 
printf("the size is %zd\n", size); // decimal size_t 
printf("the size is %zx\n", size); // hex size_t 

另一長度改性劑可用是hh(對於char),h(對於short),l(對於long),ll(對於long long) ,j(用於intmax_t),t(用於ptrdiff_t)和L(用於long double)。參見C99標準的§7.19.6.1(7)。

+0

zd和zu有什麼區別?我得到的那個zd是十進制的,但它是否被簽名,如果是這樣的話,zd是如何簽名的。 – 2010-01-24 03:51:54

+1

這是'size_t'和'ssize_t'之間的區別;後者很少被使用。 – 2010-01-24 03:53:25

+20

對,所以在這種情況下,你應該使用'%zu',因爲參數是無符號的。 – caf 2010-01-24 23:03:57

25

是的,有。它是%zu(按照ANSI C99的規定)。

size_t size = 1; 
printf("the size is %zu", size); 

注意size_t是無符號的,因此%ld是雙重錯誤的:錯誤的長度改性劑和錯誤的格式轉換說明。如果您想知道,%zdssize_t(已簽名)。

0

MSDN,說Visual Studio支持32位和64位平臺上可移植代碼的「I」前綴。

size_t size = 10; 
printf("size is %Iu", size); 
+3

它是MS特定的,不符合標準,所以它不是平臺獨立的 – 2016-06-24 07:24:10