C语言之write()函数解析:Write Failed Bad address
在ARM开发板上跑如下测试程序的时候会概率性出现“Write Failed Bad address”:/* Write test */#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>in...
·
在ARM
开发板上跑如下测试程序的时候会概率性出现“Write Failed Bad address
”:
/* Write test */
#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 = "testfile";
char buff[30] = "Testing";
w_rw = 1; // 1 - write , 2 - rewrite
nob = 1024; // No of bytes to write
for(i = 0; i < w_rw; i++){
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;
}
尝试跟踪代码一直找不到具体原因,于是查看write()
函数的man
手册,该函数的说明如下:
函数定义:ssize_t write (int fd, const void * buf, size_t count);
函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。
返回值:如果成功write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错误代码存入errno中。
这里从buf
里面写入fd
文件的字节是由count
决定的,而不是buf
的实际分配内存决定。这样就存在一种访问无效地址(Bad address
)的情况:如果count
的值大于buf
的实际分配内存大小,write()
函数就有可能尝试访问超出buf
实际内存空间的无效地址。
上述测试代码的问题是buf
比较小,只有30字节,write()
试图写的是1024字节,这样就会概率性访问到无效地址。只需要修改如下代码即可解决该问题:
if((bw = write(fd,buff,sizeof(buf))) < 0){
perror("Write failed!");
return -1;
}
更多推荐
所有评论(0)