gpt4 book ai didi

c - 对小文件使用读取时堆栈溢出的解释和有问题的解决方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:58 26 4
gpt4 key购买 nike

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

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

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_charactersread( ) 如果为正则返回。

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

关于c - 对小文件使用读取时堆栈溢出的解释和有问题的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1630904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com