低级写入分段错误

时间:2015-06-05 12:23:20

标签: c pointers file-io segmentation-fault

我已经创建了一个低级包装函数,用于写入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'

2 个答案:

答案 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);