2011-07-18 107 views
0

这里我遇到了一个奇怪的问题,关于在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炭读缓冲和最后一个是“\ 0”,它像一个字符串。但resule是奇数,下面是交流文件,这个程序的结果, 交流

1234567890abcd 

结果

1234567893øþzôo` 

看来这串出缓冲器的,我也弄不清发生了什么, 谁能帮我? 谢谢。

回答

1

您说“我认为buf应该初始化为零”。编译器不会自动为您做到这一点,所以你需要亲自做这件事,如果这是你想要什么:缓冲区被初始化

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

之前,你必须在它的内容会是什么没有保证。

+2

甚至是char char [10] = {0};'。 – Hugh

+0

设置为0是好的,但默认为什么编译器没有初始化buf为零?我将代码更改为** static char buf [10] **,然后它有一个正确的输出,我认为** char buf [10] **和** static char buf [10] **具有相同的静态持续时间,并且应该以相同的方式默认初始化 –

+0

ok。我明白了,他们不同,我有一个错误的理解。 'char buf [10]'不会初始化,因为它位于main()块中。谢谢你们。 –

2

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

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

buf[9] = '\0'; 
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); 
    } 
} 

如果你添加它,会发生什么?

0

您应该初始化buf为全部0.