我知道在while循环中声明一个char[]
变量是有作用域的,我看到了这篇帖子:在C语言中重新声明变量。
阅读一个关于在C
中创建简单web服务器的教程时,我发现我必须手动清除赋予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);
}
由以下进行更正:
while (1)
{
...
char responseData[8000];
memset(responseData, 0, strlen(responseData));
...
}
对于来自JavaScript的人来说,这很令人惊讶。为什么我要声明一个变量并访问同名不同作用域下的变量的内存内容呢?为什么C
不会在幕后重置那个内存呢?
此外...为什么不同作用域中同名的变量被分配相同的内存地址呢?
根据这个问题:Variable declared interchangebly has the same pattern of memory address 并非如此。然而,我发现这种情况相当可靠。
responseData
作为字符串使用,那么你可以保持7999字节未初始化,并简单地将'\0'
赋值给第一个:char responseData[8000]; *responseData = 0;
- pmgchar responseData[8000] = {0};
。在底层,它将被编译成与memset
等效的内容。 - Eugene Sh.*responseData = 0;
只会将前面未清除的8000个字节中的第一个字节写入,这将使对象成为长度为零的正确字符串。后续的字符串操作(特别是strcat()
函数)将会完成正确的任务。 - pmg