C语言使用管道逐字符发送数据时write调用编译错误如何解决?
问题原因
你的代码存在两处明确错误,和管道本身能力无关:
write系统调用的第二个参数要求传入待写入数据的内存起始地址(const void *类型),你直接传入了str[j]这个char类型的字符值,编译器会把这个字符值当作内存地址处理,因此触发了「整数转指针未做强制类型转换」的告警。- 写入长度参数配置错误:你需要逐字符写入时,第三个参数应该设为1,而非
BUFFER_SIZE。即便传对了指针,写BUFFER_SIZE长度也会导致write从当前字符地址往后越界读取多余内存,触发未定义行为。
修复代码
只要给字符取地址,同时指定写入长度为1即可正常运行,管道完全支持单字符写入:
for(int j=0; j<strlen(str); j++){ write(fd[WRITE_END], &str[j], 1); }
额外说明
如果没有特殊的逐字符发送要求,直接将字符串首地址和字符串长度传给write即可一次性写入整串,管道作为字节流传输会保证数据的顺序和完整性,不需要额外逐字符循环:
write(fd[WRITE_END], str, strlen(str));
内容的提问来源于stack exchange,提问作者user530567
相关产品推荐
相关产品推荐

