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

标签 c linux stack-overflow

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

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

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/

相关文章:

python - 使用 Python API 为 C 项目安装脚本

C# 'System.StackOverflowException' 在 InitializeComponent()

recursion - 为什么递归 WebGL 函数不会导致堆栈溢出?

c++ - C++中最大递归调用次数的数量级是多少?

c - 为什么 C 中的递归函数将控制权返回给 main,而不是先前的调用?

C - 使用 scanf 问题查找最大、最小和平均值

c - 如何使用 ssh 命令,使用 execlp()?

linux - 什么是最好的 Emacs 工作区插件?

c - 将变量固定到 LLVM IR 中的寄存器

c++ - 如何分析内存使用情况?