You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何write函数向文件描述符写入100字节?缓冲区仅12字节

问题:write函数为何写入了100字节而非预期的12字节?

我编写了如下代码,将buf[12]中的"hello world"复制到foo.txt文件,代码执行成功。但我有一个疑问:buf[12]中仅包含12个字符(包括'\0'终止符),write函数难道不应该只向文件写入12字节吗?为何实际写入了100字节?(我原本以为write函数最多只会写入MAXLINE字节)。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#define MAXLINE 100 

int main() {
    char buf[12] = "hello world";
    int fd, writtenbytes;

    fd=open("foo.txt", O_RDWR, 0);

    if(fd == -1) {
        perror("Error opening file");
        exit(1);
    }

    if ((writtenbytes = write(fd, buf, MAXLINE)) < 0 ) {
        perror("writing");
    }

    printf("writtenbytes: %d\n", writtenbytes);
}

执行输出

writtenbytes: 100

问题解答

  • 核心原因:write是底层系统调用,它完全按照你传入的第三个参数(要写入的字节数)读取内存数据,既不会识别字符串的'\0'终止符,也不会检查缓冲区的实际大小。你这里传了MAXLINE=100,所以它会尝试从buf的起始位置读取100字节写入文件。
  • 为何写入100字节:buf只有12字节,剩下的88字节是栈上的未初始化随机内存数据,write会把这些随机内容一并写入文件,最终总共写入100字节。
  • 正确写法:如果要写入buf中的有效字符串(包含'\0'),第三个参数应该用strlen(buf)+1;如果不需要写入终止符,用strlen(buf)即可;也可以直接写固定值12。
  • 额外注意:原代码中open函数如果目标文件不存在会打开失败,建议加上O_CREAT标志并指定文件权限,比如open("foo.txt", O_RDWR | O_CREAT, 0644)。

内容的提问来源于stack exchange,提问作者Mory

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:22:50