2010-05-28 51 views
1

我剛開始用CPP和我一直在關注不同的例子向他們學習,我看到緩衝區大小以不同的方式設置,例如:緩衝區大小:N * sizeof(type)或sizeof(var)? C++

char buffer[255]; 
StringCchPrintf(buffer, sizeof(buffer), TEXT("%s"), X); 

VS

char buffer[255]; 
StringCchPrintf(buffer, 255*sizeof(char), TEXT("%s"), X); 

哪一個是正確的使用方法?

我在喜歡的InternetReadFile,ZeroMemory和的MultiByteToWideChar等功能看到了這一點。

回答

4

兩者都不正確。

您正在使用StringCchPrintf(),它對字符計數進行操作,而不是字節數。 sizeof(buffer)返回緩衝區的大小(以字節爲單位),255 * sizeof(char)也是如此。 255 * sizeof(char)還有一個缺點,就是你在兩個地方複製了數組的大小 - 如果你改變了緩衝區的大小但忘記了在調用StringCchPrintf的時候,你有一個bug。

出現這種情況,因爲的sizeof(char)的工作始終是1

您還指定緩衝區爲char,但使用TEXT()串繞 - 與UNICODE編譯會導致中斷。

任何一個都將是正確的:

char buffer[255]; 
StringCchPrintf(buffer, ARRAYSIZE(buffer), "%s", X); 

TCHAR buffer[255]; 
StringCchPrintf(buffer, ARRAYSIZE(buffer), TEXT("%s"), X); 

char buffer[255]; 
StringCbPrintf(buffer, sizeof(buffer), "%s", X); 

TCHAR buffer[255]; 
StringCbPrintf(buffer, sizeof(buffer), TEXT("%s"), X); 
+1

'sizeof(char)'總是返回1,不管平臺(和即使實際尺寸較小,就像一個半字節)。 – zneak 2010-05-28 23:44:55

+1

我還應該注意,即使'char'超過8位,sizeof(char)也會返回1。 – zneak 2010-05-28 23:55:22

+0

TCHAR數組的最後一個「sizeof(buffer)」是錯誤的! 使用_countof()而不是_sizeof(),或者使用sizeof(buffer)/ sizeof(TCHAR)。 – Stefan 2010-05-29 08:28:30

0

鑑於上述兩個變體,第一個是好得多,因爲它沒有重複「神奇常數」 255如果你需要的第二個變體與第一競爭力,你必須做的

const size_t BUFFER_SIZE = 255; 
char buffer[BUFFER_SIZE]; 
StringCchPrintf(buf, BUFFER_SIZE*sizeof(char), TEXT("%s"), X); 
+1

這是否正確取決於功能需要什麼。如果它需要__bytes__的數量,那麼它是正確的,如果它需要__objects__的數量,那麼它是錯誤的。但即使在後一種情況下,'... * sizeof(char)'也是毫無意義的。'sizeof(char)'定義總是1,所以你可以省略'char',如果類型將會改變,'... * sizeof(char)'也沒有任何幫助,因爲它明確地重複該類型。爲什麼不'BUFFER_SIZE * sizeof(buffer [0])'? (如果該緩衝區不是動態分配的,'sizeof(buffer)* sizeof(buffer [0])''也可以。) – sbi 2010-05-29 00:02:18

0

sizeof(buffer)將用於靜態分配陣列工作,但不是一個動態分配的數組:

char buffer[255]; 
cout << sizeof(buffer) << endl; // prints 255 
char *p = new char[255]; 
cout << sizeof(p) << endl;  // prints 8 (on a 64-bit machine) 
delete[] p; 
return 0; 

考慮到這一點我總是建議使用N * sizeof(type)爲了一致性並避免細微的錯誤。

0

你應該使用常量來表示大小,而不是像你一樣使用整數。

每微軟,正確的形式來計算你想要的是這樣的:

的sizeof數組/數組的sizeof [0]

http://msdn.microsoft.com/en-us/library/4s7x1k91%28VS.71%29.aspx

此外,的sizeof是不完美的,因爲在某些情況下,它將返回指針的大小而不是數組的大小。在這種情況下,SIZE OF這個詞有點誤導人,因爲你必須問自己 - 我究竟在做什麼SIZE OF

+0

埋在Windows頭文件中的某個地方有一個名爲'_countof'的預處理器宏,它基本上擴展到了上面。 – dreamlax 2010-05-28 23:44:00