c - 为什么这个缓冲区定义在一个循环内?

标签 c sockets tcp

我一直认为我不应该在循环内定义变量,因为这是不必要的或浪费的。这让我想知道以下 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/

相关文章:

c - MPI_Scatterv 段错误

java - JME 中的线程不起作用

Java——如何从输入流(套接字/套接字服务器)中读取未知数量的字节?

c - 使用 Linux 套接字检测 TCP 重置

c - ISO C 是否允许分配的内存在程序终止后挂起?

c - Safari 无法与我的 TCP 服务器配合使用

c - scanf()不读取EOF吗?

c - c程序中TCP套接字编程中如何将整个字符串传递给读写函数

java - JAX-WS 客户端关闭与 FIN、ACK 的 tcp 连接

linux - 如何用erlang搭建TCP服务器?