奇怪的读缓冲区

时间:2011-07-18 03:11:05

标签: c buffer

这里我遇到了一个关于linux中c读取函数的奇怪问题。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char** argv){
    int fd=open("a.c",O_RDONLY);
    if(fd==-1){
      fprintf(stderr,"%s\n",strerror(errno));
    }
    char buf[10];
    if(read(fd,buf,9)==-1){
      fprintf(stderr,"%s\n",strerror(errno));
    }else{
      printf("%s\n",buf);
    }
}

我认为buf应该初始化为零,所以前9个char读取缓冲区,最后一个是'\ 0',它就像一个字符串。但是resule很奇怪,下面是a.c文件和这个程序的结果, 交流转换器

    1234567890abcd

结果

    1234567893øþzôo`

似乎这个字符串没有缓冲区,我无法弄清楚发生了什么,有人可以帮助我吗? 感谢。

4 个答案:

答案 0 :(得分:2)

当您打印字符数组而不结尾'\ 0'时,printf将打印所有字符,直到它在内存中找到'\ 0'。在这种情况下,看起来像'1234567893øþzôo`后跟'\ 0'。请注意,printf不知道'buf'数组的大小,因此它甚至会打印在buf数组结束后出现的那些字符。

正如您所建议的那样,最好将整个缓冲区设置为0或在末尾显式添加“\ 0”(如下面的代码所示)。

   buf[9] = '\0';

答案 1 :(得分:1)

ISTM你的缓冲区不是零终止,因为你只读了9个字符。更改代码的最后一部分:

  if(read(fd,buf,9)==-1){
    fprintf(stderr,"%s\n",strerror(errno));
  }else{

    /* add this */ 
    buf[9] = '\0';

    printf("%s\n",buf);
  }
}

如果你添加它会怎么样?

答案 2 :(得分:1)

你说“我认为buf应该初始化为零”。编译器不会自动为您执行此操作,因此如果您愿意,则需要自己执行此操作:

char buf[10];
memset(buf, 0, sizeof(buf));

在初始化缓冲区之前,您无法保证其内容是什么。

答案 3 :(得分:0)

你应该将buf初始化为全0。