写入失败:错误的地址

时间:2014-01-23 08:59:02

标签: c

/* Write and rewrite */
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int main(int argc,char* argv[]){
 int i = 0;
 int w_rw = 0;
 int fd = -1;
 int bw = -1;
 int nob = 0;
 char* file_name = "myfile";
 char buff[30] = "Dummy File Testing";

 w_rw = 1;       // 1 - write , 2 - rewrite
 nob = 1000000;  // No of bytes to write

 printf("\n File - Create,Open,Write \n");

 for(i = 0; i < w_rw; i++){
        printf("fd:%d line : %d\n",fd,__LINE__);
        if((fd = open(file_name,O_CREAT | O_RDWR))< 0){
                perror("Open failed!");
                return -1;
        }

        printf("fd:%d",fd);
        if((bw = write(fd,buff,nob)) < 0){
                perror("Write failed!");
                return -1;
        }
        printf("\n Bytes written : %d \n",bw);
 }

 return 0;
}

我遇到写入错误,尝试写入1MB字节的数据时出现错误的地址失败。为什么会这样?

3 个答案:

答案 0 :(得分:2)

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

write()系统调用将从nbytes读取buf个字节,并写入文件描述符fd引用的文件。

在您的计划中,bufnbytes相比很小,因此write()尝试访问无效的地址位置,因此会给出错误地址错误。

您的buf buff [30] 更改为 buf [1000000] ,您可以解决问题。

错误地址错误表示您提供的地址位置无效

Wikipedia giving good explanation with example program about write

答案 1 :(得分:1)

你的buff数组应至少为nob字节长,以便写入调用成功...

答案 2 :(得分:1)

根据write write() writes up to count bytes from the buffer pointed buf to the file referred to by the file descriptor fd的人所说,你正在超越字符串缓冲区。

如果你想用该字符串try fwrite填充文件,你可以指定字符串长度和写缓冲区的总次数(nob / strlen(buff)?)。