见评论: 我的立场是正确的。我被告知了。但是,我仍然认为依靠这样的内部结构是疯狂的。我使用的最后一个 microsoft 编译器违反了 C99 标准,这让我悲痛欲绝。如果他们不能在vsnprinf()或new 上获得正确的返回值,你真的要依赖这样的勘误表吗?
您正在对向量的实现方式做出假设。您假设 v[1] 紧跟在内存中的 v[0] 之后。
char buf[];之间有区别 & buf[1] == & buf[0] + 1 和 向量 v; & v[1] == & v[0] + 1。char 数组使用指针算法。向量使用运算符 []。向量如何在内部存储数据,无论是否相邻,都取决于该向量类。
虽然您的代码可能仍然有效,但这仍然是一件坏事!它使您的软件变得脆弱,导致它在您最不期望的时候以奇怪和预期的方式崩溃!
这是本地堆栈上临时 char 数组的理想情况。尺寸很小。您有一个硬编码的最大尺寸。
如果大小不是恒定的,我仍然会在堆栈上使用一个小的本地字符数组缓冲区。我只是在每次迭代后将它附加到 C++ std::string 中。(是的,std::strings 可以存储包含多个空字符的二进制值。)
recv()返回它读取的字节数。Vector v不会自动拾取它。因此,您需要存储和使用该值。
我建议:
#define BUFFER_SIZE (1024*16)
#define FLAGS 0
int received = 0;
int total = 0;
char buffer [ BUFFER_SIZE + 1 ];
memset( buffer, 0, BUFFER_SIZE + 1 );
received = recv( sockfd, buffer, BUFFER_SIZE, FLAGS );
if ( received > 0 )
{
copy( buffer + total,
buffer + total + received,
ostream_iterator<char>(cout) );
total += received;
}
while( (received > 0) && (total < BUFFER_SIZE) )
{
received = recv( sockfd, buffer + total, BUFFER_SIZE - total, FLAGS );
if ( received > 0 )
{
copy( buffer + total,
buffer + total + received,
ostream_iterator<char>(cout) );
total += received;
}
}
buffer [ total ] = '\0';
buffer [ BUFFER_SIZE ] = '\0';
cout << "The total size is " << total << endl;