我一直认为我不应该在循环内定义变量,因为这是不必要的或浪费的。这让我想知道以下 recv() 函数是否需要为循环的每次迭代提供一个新缓冲区:
while (totalBytesRecvd < echoStrLen)
{
char buffer[BUFSIZE];
numBytes = recv(sock, buffer, BUFSIZE - 1, 0);
...
totalBytesRecvd += numBytes;
buffer[numBytes] = '\0';
fputs(buffer, stdout);
}
recv() 的文档没有提及它如何使用缓冲区指针。为了更好地理解,我尝试在循环之前定义缓冲区,并且 recv() 似乎覆盖了缓冲区,而不是重新定义它。这是有道理的,因为 recv() 被传递了一个指向缓冲区开头的指针。
在循环内一遍又一遍地定义缓冲区是否有特定原因?或者我对此的基本理解是否正确?
最佳答案
recv
,和read
等类似的函数一样,不关心buffer之前的内容,它只是用来写结果。
但这并不会有什么不同:因为您没有初始化缓冲区,即使您将变量声明为循环的局部变量,它的内容也将是“未定义的”。
此外,在大多数 C 实现上:
- 不初始化该变量意味着它将获取堆栈中该位置的任何内容,这反过来意味着它将获取与上一次迭代相同的位置,从而有效地为您提供完全相同的结果因为变量在循环之外。
- 堆栈分配很便宜——通常他们只需要调整一个寄存器;
- 实际上,它们甚至更便宜:通常寄存器调整只在函数的开头完成,占所有局部变量;局部变量的作用域只是一个编译时构造,因为它是在函数启动时分配的。
显然,相反,如果您初始化您的变量,它会有所不同——执行初始化的代码必须在每次迭代时运行;但是,如上所述,不需要初始化任何东西,recv
只是不关心缓冲区的当前状态。
关于c - 为什么这个缓冲区定义在一个循环内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12548918/