write() 函数错误地址

8

我正在尝试写出一个以字节为单位定义字符串大小的代码,例如:

#define PATHA "/tmp/matrix_a"

可以使用以下代码:

rtn=write(data,(strlen(PATHA)*sizeof(char)),sizeof(int));
if(rtn < 0) 
    perror("Writing data_file 2 ");

我收到了写入 data_file 2 :坏地址的报错信息。

这个“坏地址”指的是什么?数据文件描述符已经打开,在上述代码段之前和之后可以正确地进行写入。需要写入文件data的数据必须是原始数据,而不是ASCII码。

我还尝试将字符串定义为一个char[],但是问题依旧。

5个回答

6
write()的第二个参数是您要写入的字节的地址,但是您正在传递要写入的字节本身。为了获得地址,您必须将这些字节存储在变量中(不能获取表达式结果的地址)。例如:
size_t patha_len = strlen(PATHA);

rtn = write(data, &patha_len, sizeof patha_len);

4

POSIX write()的参数包括:

#include <unistd.h>

ssize_t write(int fildes, const void *buf, size_t nbyte);

这是:

  • 文件描述符
  • 缓冲区
  • 大小

你传递了两个大小而不是一个地址和一个大小。

使用:

rtn = write(data, PATHA, sizeof(PATHA)-1);

或者:

rtn = write(data, PATHA, strlen(PATHA));

如果您想将字符串的大小作为一个int写入,那么您需要一个int变量传递给write(),像这样:

int len = strlen(PATHA);

rtn = write(data, &len, sizeof(len));

请注意,如果您想编写一个 size_t 变量,就不能简单地使用它;特别是在64位Unix系统上,一般情况下 sizeof(size_t) != sizeof(int),您需要决定要编写的大小。
您还需要知道,有些系统是小端序,而其他系统是大端序,因此在其中一种类型上使用此机制编写的内容在另一种类型上不可读(除非在I/O操作之前或之后进行映射工作)。您可以选择忽略这个问题,或者决定使用便携式格式(通常称为“网络顺序”,等同于大端序),或者决定定义您的代码使用相反的顺序。如果您小心谨慎,可以编写代码以使所有平台使用相同的逻辑(并且所有平台得到相同的答案)。

我认为你建议的代码不太对。OP想要写出PATHA的长度而不是它的内容。 - simonc
这是一种可能性 - 从问题中并不清楚,但也许更能解释 sizeof(int) - Jonathan Leffler

3
write() 的第二个参数是缓冲区,第三个参数是大小:
ssize_t write(int fd, const void *buf, size_t count);

这段代码传递的长度被解释为地址,这是不正确的。编译器应该发出一个警告(不要忽略编译器警告,并将警告级别设置为最高级别)。

修改为:

rtn=write(data, PATHA, strlen(PATHA));

注意:sizeof(char)被保证为1,因此可以在大小计算中省略它。

正确的做法是将其作为原始二进制数据而不是ASCII文本。 - fotg
@nos,我看你是对的。我必须承认这从未发生在我身上,而且已经有答案了。 - hmjd

2
Bad address 错误已经有答案了。如果你想打印字符串的长度,只需使用printf即可。
printf("Length: %d\n", strlen(data));

要么你可以编写一个将整数转换为字符串并打印输出的函数...我更喜欢printf :)

我正在向文件描述符data写入数据,写操作需要是无缓存和原始的,而不是ASCII。 - fotg

1
rtn = write(data, PATHA, strlen(PATHA));

我认为这是你想要的。参数应该是:

  1. 文件描述符(数据)
  2. 源缓冲区(您的字符串常量PATHA)
  3. 从该缓冲区中读取的字节数(使用同一PATHA常量上的strlen()测量)

此外,为了完整起见,您应始终检查rtn以了解您已编写的字符数。不能保证在所有描述符类型上都会write()请求的所有字节。因此,有时您最终按照它所写入的数量和您仍然需要编写的数量进行分块写入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接