读取C个最小字节

时间:2018-10-18 07:34:56

标签: c

我很好奇为什么从文件中读取少于4个字节时输出损坏。

这是我的测试文件:

closure

还有一个用于读取文件的简单程序:

user@UnixVM:~/labs$ cat foo.txt
helloworld

输出已损坏,执行之间可能有所不同:

int main()
{
        int file=0;
        if((file=open("foo.txt",O_RDONLY)) < -1)
                return 1; 
        char buffer[11];        
        read(file,buffer,3);
        printf("%s\n",buffer);
        return 0;
}

但是每当我使字节数大于或等于4(user@UnixVM:~/labs$ gcc -Wall lab1_4.c -o lab1_4 ; ./lab1_4 hel2 user@UnixVM:~/labs$ gcc -Wall lab1_4.c -o lab1_4 ; ./lab1_4 hel▒ )时,它就可以正常工作。

2 个答案:

答案 0 :(得分:6)

您的输出已“损坏”,因为buffer不包含以 NUL 结尾的C字符串。进一步了解undefined behavior。是scared(UB有时会出现 起作用,这也许可以解释您的实验内容)。

因此,在致电read之前,请添加memset(buffer, 0, sizeof(buffer))以清除您的buffer。或使用char buffer[11] ="";对其进行初始化(两者几乎相同,并且可能启用了gcc -O2这样的优化以生成相同的机器代码)。由于缓冲区的长度为11个字节,并且read最多为3个字节,因此您可以确定它在<read之后终止了 NUL

确保编译所有警告和调试信息(以您的情况为gcc -Wall -Wextra -g lab1_4.c -o lab1_4)。阅读How to debug small programs

请仔细阅读read(2)和所使用的每个功能的文档。注意read的返回计数。您应该测试并使用它。

答案 1 :(得分:-2)

让我们从上至下阅读它:

if((file=open("foo.txt",O_RDONLY)) < -1)

如果您read the Open man page,您会看到它在失败时返回-1,因此由于“ <”,您的陈述是错误的。

然后

char buffer[11];        
read(file,buffer,3);

您声明一个大小为11的缓冲区,但读取了3个字节。可以,这不是最好的方法,但它不会爆炸。

但是

printf("%s\n",buffer);

此行有问题。您应该read this tutorial about strings in C来理解。

每当遇到内存问题时,请使用Valgrind,这是一个很好的工具,可以帮助您查看错误所在。