我一直认为我不应该在循环中定义变量,因为它不必要或浪费.这让我想知道以下recv()函数是否需要为循环的每次迭代提供一个新的缓冲区:
while (totalBytesRecvd < echoStrLen)
{
char buffer[BUFSIZE];
numBytes = recv(sock, buffer, BUFSIZE - 1, 0);
...
totalBytesRecvd += numBytes;
buffer[numBytes] = '\0';
fputs(buffer, stdout);
}
Run Code Online (Sandbox Code Playgroud)
recv()的文档没有提到它如何使用缓冲区指针.为了更好地理解,我尝试在循环之前定义缓冲区,并且recv()似乎覆盖缓冲区,而不是重新定义它.这是有道理的,因为recv()传递一个指向缓冲区开头的指针.
是否有特定的理由在循环内反复定义缓冲区?或者我对此的基本理解是否正确?
recv作为read和其他类似的功能,不关心的缓冲区以前的内容,它使用它只是写的结果.
并不是说它会产生任何影响:因为你没有初始化你的缓冲区,即使你将变量声明为循环的本地变量,它的内容也将是"未定义的".
此外,在大多数C实现上:
显然,相反,如果你初始化你的变量,它将是不同的 - 执行初始化的代码必须在每次迭代时运行; 但是,如上所述,没有必要初始化任何东西,recv只是不关心缓冲区的当前状态.
这不浪费.它声明了此变量的范围.编译器可以回收堆栈上的空间用于其他目的,而不是从此范围之外的堆栈中分配更多.它在运行时不需要额外的费用 - 编译器在编译时计算必要的堆栈空间,并在函数开头只调整一次堆栈指针.