在上一学期的系统编程课程中,我们必须在C中实现一个基本的客户端/服务器.初始化结构,比如sock_addr_in,或者char缓冲区(我们用来在客户端和服务器之间来回发送数据)教授指示我们只使用bzero而不是memset初始化它们.他从未解释过为什么,而且我很好奇是否有正当理由呢?
我在这里看到:http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdown这bzero是更有效的,由于一个只能将要归零记忆的事实,所以也没有必须做任何额外的检查memset.尽管如此,这仍然不一定是绝对不能memset用于归零内存的理由.
bzero被认为已弃用,而且不是标准的C函数.根据手册,memset因此优先考虑bzero.所以,你为什么要仍然使用bzero过memset?只是为了提高效率,还是更多?同样,有什么好处memset了bzero,使它成为新的程序的事实上的首选?
我知道char[]看过这篇文章:在C中重新声明变量是在while循环中声明变量的范围。
通过学习有关在中创建简单Web服务器的教程C,我发现我必须手动清除responseData在下面的示例中分配的内存,否则,的内容将index.html被连续地追加到响应中,并且响应中包含来自index.html以下内容的重复内容:
while (1)
{
int clientSocket = accept(serverSocket, NULL, NULL);
char httpResponse[8000] = "HTTP/1.1 200 OK\r\n\n";
FILE *htmlData = fopen("index.html", "r");
char line[100];
char responseData[8000];
while(fgets(line, 100, htmlData) != 0)
{
strcat(responseData, line);
}
strcat(httpResponse, responseData);
send(clientSocket, httpResponse, sizeof(httpResponse), 0);
close(clientSocket);
}
Run Code Online (Sandbox Code Playgroud)
更正依据:
while (1)
{
...
char responseData[8000];
memset(responseData, 0, strlen(responseData));
...
}
Run Code Online (Sandbox Code Playgroud)
来自JavaScript,这令人惊讶。为什么我要声明一个变量并可以访问在相同名称的不同范围中声明的变量的内存内容?为什么不C只是在后台重置内存?
另外...为什么在不同作用域中声明的同名变量被分配相同的内存地址?
根据这个问题:交替声明的变量具有与 ISN情况相同的内存地址模式。但是,我发现这种情况确实可靠。