在小文件上使用read和可疑的解决方法时堆栈溢出的说明
-
06-07-2019 - |
题
我希望这个问题解释了我的问题。如果“有效”的解决方法,我将不胜感激。解释了。
传统阅读文件的方式(我知道)
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'
时,你已经超出数组边界。
其他提示
一个问题:
buffer[MAX]='\0';
堆栈上的步骤,因为MAX的数组的最高有效索引是MAX-1(由于基于0的索引)。
-1读取返回值表示错误,所以正确测试read()>此外,read的正常返回值是读取的字节数,而read不保证任何0终止。你必须按照
的方式做点什么while (bytesRead=read() > 0) {
write(buffer, bytesRead);
...
瞥了一眼代码,我建议这是因为逻辑不同。
在有效的示例中, read(fd,buffer,MAX)
方法正在执行两次。
想想它:
while (dosomething() != 0 || dosomething() != -1)
{
// some work
}
如果dosomething()方法是幂等的,则此循环将是无限的,但是如果第一次在while语句中运行它与第二次不同,它将会中断。
这解释了执行路径如何不同,但我无法弄清楚为什么第一个选项溢出......我会考虑并更新。 (或不 - 似乎已经回答了!)
试试这个:
int fd, readCharacter;
char buffer[MAX];
while( readCharacter = read(fd, buffer, MAX**-1**) > 0 )
{
buffer[readCharacter] = '\0';
// ...
}
不隶属于 StackOverflow