写()坏地址

时间:2012-12-05 22:37:42

标签: c linux

我正在尝试写出定义为

的字符串的字节大小

#define PATHA "/tmp/matrix_a"

使用代码

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

我回来了Writing data_file 2 : Bad address

究竟这是一个糟糕的地址?数据文件描述符是打开的,并且在上述代码段之前和之后立即正确写入。要写入文件data的数据需要是原始数据,而不是ASCII。

我也尝试将字符串定义为具有相同问题的char []

5 个答案:

答案 0 :(得分: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,否则不能只使用size_t变量;在64位Unix系统上,特别是sizeof(size_t) != sizeof(int),一般来说,你需要决定你要写的是哪个大小。

你还需要注意一些系统是little-endian和其他big-endian,你在一种类型上使用这种机制编写的内容在另一种类型上是不可读的(没有在之前或之后完成映射工作) I / O操作)。你可能会选择忽略这个问题,或者你可能决定使用可移植格式(通常称为'网络顺序',相当于big-endian),或者你可能决定定义你的代码使用相反的订购。你可以编写代码,以便在你小心的时候在所有平台上使用相同的逻辑(并且所有平台都得到相同的答案)。

答案 1 :(得分:3)

write()的第二个参数是缓冲区,第三个参数是大小:

ssize_t write(int fd, const void *buf, size_t count);

发布的代码传递的长度被解释为不正确的地址。编译器应该发出警告(不要忽略编译器警告并使用最高级别的警告级别进行编译)。

更改为:

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

注意sizeof(char)保证为1,因此可以从尺寸计算中省略。

答案 2 :(得分:2)

Bad address错误已得到解答。如果你想写一个字符串的大小,只需使用printf

printf("Length: %d\n", strlen(data));

或者你可以编写一个函数,将整数转换为字符串并打印出来...我更喜欢printf:)

答案 3 :(得分:2)

write()的第二个参数是要写入的字节的地址,但是您要传递自己想要写入的字节。为了获取地址,您必须将这些字节存储在变量中(您不能获取表达式结果的地址)。例如:

size_t patha_len = strlen(PATHA);

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

答案 4 :(得分:1)

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

是你想要的。参数应该是

  1. 文件描述符(数据)
  2. 源缓冲区(您的字符串常量PATHA)
  3. 从该缓冲区中提取的字节数(使用相同PATHA常量上的strlen()进行测量)
  4. 另外,要完成,您应该始终检查rtn您写的字符数。您不能保证写入()所有描述符类型上请求的所有字节。所以有时候你最终会把它写成块,由它所写出的答案数量决定,以及你知道你还有多少时尚写作。