2010-05-28 70 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