1

我希望这个问题能解释我的问题。如果解释“有效”的解决方法,我也将不胜感激。

读取文件的传统方式(我知道)

int fd;
char buffer[MAX];
while(read(fd,buffer,MAX)>0)
{
         buffer[MAX]='\0';
         write(sockfd,buffer,MAX);
         memset(buffer,NULL,MAX);
}

导致溢出。以某种方式意外起作用的解决方法是

   while((read(fd,buffer,MAX)!=0)||(read(fd,buffer,MAX)!= -1))
   {
         buffer[MAX]='\0';
         write(sockfd,buffer,MAX);
         memset(buffer,NULL,MAX);

   }

^^ 这段代码打印出整个文件,没有跳过可观察到的。

do
{
     int temp;
     temp=read(fd,buffer,MAX);
     if((temp == 0) || (temp == -1))
     {
              break;
     }
     buffer[MAX]='\0';
     write(sockfd,buffer,MAX);
     memset(buffer,NULL,MAX);
 }while(1);

也造成了堆栈溢出。我在这里错过了一些非常重要的东西吗?

谢谢

4

4 回答 4

3

为什么说它会导致溢出?

请注意,read()不会\0char数组末尾写入 a ,因此如果您执行类似操作printf("%s", buffer),它可能会失败,因为printf会期待 NUL 终止的字符串。您可能想要读取MAX-1并设置number_of_read_charactersbuffer[number_of_read_characters] = '\0'的返回值(如果为正)。read()

另请注意,当您声明 时char buffer[MAX],由于在 C 中索引是从零开始的,因此最高buffer索引是MAX-1,所以当您设置时,buffer[MAX]='\0'您已经超出了数组范围。

于 2009-10-27T13:51:17.207 回答
1

一个问题:

buffer[MAX]='\0';

堆栈上的步骤,因为大小为 MAX 的数组的最高有效索引是 MAX-1(由于从 0 开始的索引)。

read 的返回值 -1 表示错误,因此测试 read() > 0 是正确的。此外,read 的正常返回值是读取的字节数,并且 read 不保证任何 0 终止。你必须做一些事情

while (bytesRead=read() > 0) {
    write(buffer, bytesRead);
...
于 2009-10-27T13:59:52.263 回答
0

看一眼代码,我建议这是因为逻辑不同。

在有效的示例中,该read(fd,buffer,MAX)方法被执行了两次。

想一想:

while (dosomething() != 0 || dosomething() != -1)
{
    // some work
}

如果 dosomething() 方法是幂等的,则此循环将是无限的,但是如果您第一次在 while 语句中运行它与第二次不同,它将中断。

这解释了执行路径的不同之处,但我无法弄清楚为什么第一个选项会溢出......我会考虑并更新。(或者没有 - 似乎已经回答了!)

于 2009-10-27T13:57:56.867 回答
0

尝试这个:

int fd, readCharacter;
char buffer[MAX];
while( readCharacter = read(fd, buffer, MAX**-1**) > 0 )
{
    buffer[readCharacter] = '\0';
    // ...
}
于 2009-10-27T14:00:01.977 回答