簡體   English   中英

緩沖區大小:N * sizeof(type)或sizeof(var)? C ++

[英]Buffer size: N*sizeof(type) or sizeof(var)? C++

我剛剛開始使用cpp,我一直在關注不同的示例以向他們學習,我看到緩沖區大小以不同的方式設置,例如:

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。

兩者都不正確。

您正在使用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);

鑒於以上兩種變體,第一種變體要好得多,因為它不會重復“魔術常數”255.如果你想讓第二種變體與第一變體競爭,你必須這樣做

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

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(類型)以保持一致性並避免細微的錯誤。

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

根據Microsoft,計算所需內容的正確形式是:

sizeof array / sizeof數組[0]

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

此外,sizeof並不完美,因為在某些情況下,它將返回指針的大小而不是數組的大小。 在這種情況下,SIZE OF這個詞有點誤導,因為你必須問自己 - 我實際上得到的是SIZE OF

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM