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>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 - rewritenob = 1024; // No of bytes to writefor(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;}
C语言之write()函数解析:Write Failed Bad address相关推荐
- R语言:rep函数解析
函数形式:rep(x, time = , length = , each = ,) 参数说明: x:代表的是你要进行复制的对象,可以是一个向量或者是一个因子. times:代表的是复制的次数,只能为正 ...
- R语言:paste函数解析
paste函数 paste (..., sep = " ", collapse = NULL) paste0(..., collapse = NULL) 参数说明: ... - 表 ...
- c++ _int64转字符串_C语言 仿JS的eval函数 解析字符串
C语言 利用后缀表达式解析字符串(符合c98标准,很容易移植到计算器上) 最近用98标准的C语言写了个解析字符串,类似于JavaScript中的eval函数,感觉挺实用(移植到了计算器上,可以画F(X ...
- C语言sprintf函数解析(实现数据类型转换到字符串)
最近在将int转为char*字符串上出了问题,最后使用sprintf函数解决, 使用实例: char *char_num; int recv_num=-123456:sprintf(char_num, ...
- 【C语言】自定义函数例题解析
C语言函数例题解析 C语言函数解析 C语言函数例题解析 值传递 自定义函数求解一元二次方程 自定义函数计算给定日期是该年的第几天 地址传递 自定义函数对N个数排序 自定义函数对字符串的处理 值传递 自 ...
- C语言rand()函数解析
C语言的rand()函数位于<stdlib.h>.该函数可以生成一个取值为0-32767的伪随机数.先看一下函数的实现. unsigned long int next = 1;int ra ...
- C语言实现json文本解析
C语言实现json文本解析 背景 总体方法 实现源码 相关资料 背景 项目中,有时需要根据外部输入条件,进行程序的灵活切换,运用JSON文件解析,能高效的替换指令行输入,且直观易懂. 总体方法 JSO ...
- C语言关于static的解析
C语言关于static的解析 #include<stdio.h> static int j; void fun1(void) { int i = 0; i ++; } void fun2( ...
- main() 函数解析(一)——Linux-0.11 剖析笔记(六)
文章目录 1. 宏定义`_syscall0` 2. `setup.s`读取的参数 3. 读取CMOS实时时钟信息 3.1 `outb_p(value,port)` 3.2 `inb_p(port)` ...
最新文章
- .NET使用OpenSSL生成的pem密钥文件[1024位]
- maven 打包时缺少文件_解决Intellij Idea下使用Maven项目打包时部分文件缺失问题
- 【神经网络八股扩展】:数据增强
- 三年亏了近50亿,网易云音乐终于熬到上市了
- C语言 pthread_cancelpthread_detach
- 空循环和无穷循环的区别
- ssh: connect to host port 22: Connection refused
- Eclipse下载与安装
- Android集成LAME库,实现pcm转mp3
- 如何解决Word只能用安全模式打开
- 一图抵千言《ARouter简明扼要原理分析》
- 云计算技术的概念、原理
- MQTT连接阿里云物联网平台步骤
- linux作业管理系统pbs,集群上作业提交系统LSF和PBS的使用与简介
- 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)
- 【UE4 第一人称射击游戏】12-全自动步枪并显示剩余弹药量
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- 第二次作业:《国际贸易学》—自由贸易理论
- HTML设置背景图片是否重复
- 12.30重大消息快递