【问题标题】:write() bad addresswrite() 错误地址
【发布时间】:2012-12-05 22:37:42
【问题描述】:

我正在尝试写出定义为

的字符串的字节大小

#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[]

【问题讨论】:

    标签: c linux


    【解决方案1】:

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

    size_t patha_len = strlen(PATHA);
    
    rtn = write(data, &patha_len, sizeof patha_len);
    

    【讨论】:

      【解决方案2】:

      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),您需要确定要写入的大小。

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

      【讨论】:

      • 我认为您建议的代码不太正确。 OP想要写出PATHA的长度而不是它的内容
      • 这是一种可能性——从问题中并不清楚,但可能更适合sizeof(int)
      【解决方案3】:

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

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

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

      改为:

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

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

      【讨论】:

      • 正确,但不是作为 ASCII 文本,而是作为原始二进制数据。
      • @nos,我看你是对的。我必须承认,我从来没有想过,并且已经得到了回答。
      【解决方案4】:

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

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

      要么这样,要么您可以编写一个将整数转换为字符串并将其打印出来的函数...我更喜欢printf :)

      【讨论】:

      • 我正在写入文件描述符data,写入需要是无缓冲和原始的,而不是ascii
      【解决方案5】:
      rtn = write(data, PATHA, strlen(PATHA));
      

      是你想要的我想。参数应该是

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

      此外,为了完整起见,您应该始终检查 rtn 以了解您写了多少个字符。您不能保证您 write() 所有描述符类型上请求的所有字节。所以有时你最终会分块写它,这取决于它回答的数量,以及你知道你还没有写多少。

      【讨论】:

        猜你喜欢
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 2015-07-12
        • 1970-01-01
        相关资源
        最近更新 更多