我希望这个问题能解释我的问题。如果解释“有效”的解决方法,我也将不胜感激。
读取文件的传统方式(据我所知)
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);
也造成了栈溢出。我在这里错过了一些非常重要的东西吗?
谢谢
最佳答案
为什么说是溢出呢?
请注意 read()
不会在 char
数组的末尾写入 \0
,因此如果您执行类似printf("%s", buffer)
它可能会失败,因为 printf
需要一个以 NUL 结尾的字符串。您可能想要阅读 MAX-1
并设置 buffer[number_of_read_characters] = '\0'
其中 number_of_read_characters 是 read( )
如果为正则返回。
另请注意,当您声明 char buffer[MAX]
时,由于在 C 中索引是从零开始的,因此最高的 buffer
索引是 MAX-1
,所以当您设置 buffer[MAX]='\0'
时,您已经超出了数组边界。
关于c - 对小文件使用读取时堆栈溢出的解释和有问题的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1630904/