我已经创建了一个低级包装函数,用于写入C:
void MyWrite(int fd, unsigned char *buffer, unsigned int length){
len=write(fd, buffer, len);
printf("Output Length = %u \n", len);
}
现在,当我发送以下内容时:
MyWrite(fileDescriptor, 0, 1);
命令导致分段错误
我想写ASCII值0
而不是ASCII字符48,即'0'
答案 0 :(得分:2)
buffer
传递为NULL(0
)。
当write()
尝试读取来自NULL地址的数据时,其最明显的副作用将为undefined behaviour。
您需要传递一个有效的指针,从中可以正确读取数据。在您编写包装器时,我建议,在包装器中为传入指针添加NULL检查。
编辑:
如果要编写数字0
,则需要传递包含该值的缓冲区。一些伪代码:
unsigned char val = 0;
MyWrite(fileDescriptor, &val, 1);
答案 1 :(得分:1)
如果您阅读write
的手册页,您会看到函数 期望 缓冲区是正确的指针,因此在取消引用之前不会进行任何检查它
因此:
MyWrite(fd, 0, 1);
将向write
发送指向0的指针,这会导致它发生段错误。
您想要做的是:
MyWrite(fd, "0", 1);
发送带有字符的字符串 '0'
或MyWrite(fd, "\0", 1);
写一个空字符(我不知道你为什么要这样做)
更好的版本:
char c = 0;
MyWrite(fd, &c, 1);