免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9171 | 回复: 6
打印 上一主题 下一主题

帮忙看一个小程序,关于write的,报错Bad address [复制链接]

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-16 16:10 |只看该作者 |倒序浏览
本帖最后由 openspace 于 2012-07-16 16:10 编辑

好长时间没写过了,需要写个小程序,测试一个功能,但是这个小程序总是报错
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <errno.h>

  9. static int flag = O_RDWR | O_CREAT | O_TRUNC;
  10. static int mode = S_IRWXU | S_IRWXG;
  11. static int buf_size = 4096;
  12. static int file_size = 4096 * 4096;

  13. /*
  14. * populate the target file with character '='.
  15. */
  16. static int populate_file()
  17. {
  18.         char buf[buf_size+1];
  19.         int targetfd;
  20.         int size = 0, tmpsize = 0, iter = 0;

  21.         targetfd = open("testfile", flag,  mode);
  22.         if (targetfd < 0) {
  23.                 perror("open target file failed");
  24.                 exit(errno);
  25.         }

  26.         memset(buf, '=', buf_size);
  27.         buf[buf_size] = '\0';

  28.         while (size < file_size) {
  29.                 tmpsize = write(targetfd, buf, buf_size);
  30.                 printf("iter %d: written %d\n", iter, tmpsize);
  31.                 if (tmpsize < 0) {
  32.                           perror("write target file failed");
  33.                           exit(errno);
  34.                 }
  35.                 iter++;
  36.                 size += tmpsize;
  37.                 if (file_size - size < buf_size);
  38.                         buf_size = file_size - size;
  39.         }

  40.         return targetfd;
  41. }


  42. int main()
  43. {
  44.         int targetfd;

  45.         targetfd = populate_file();

  46.         close(targetfd);

  47.         return 0;
  48. }
复制代码
输出如下:
iter 0: written 4096
iter 1: written -1
write target file failed: Bad address


论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-07-16 16:25 |只看该作者
                if (file_size - size < buf_size);
                        buf_size = file_size - size;

后面传递给write的长度不对了

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
3 [报告]
发表于 2012-07-16 19:17 |只看该作者
回复 2# hellioncu


    唉,好长时间没写C代码,眼神就是不如以前了

    谢谢~

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
4 [报告]
发表于 2013-09-09 14:06 |只看该作者
那么正确的大小,是什么的呢?
我没有找到问题所在。
回复 3# openspace


   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
5 [报告]
发表于 2013-09-09 15:13 |只看该作者
回复 1# openspace
  1. 多了个分号吧:
  2. if (file_size - size < buf_size);
复制代码

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
6 [报告]
发表于 2013-09-09 15:14 |只看该作者
回复 4# firocu


    多个了分号导致后续的条件执行错误,错误的计算了buf_size。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2013-09-09 15:22 |只看该作者
在使用errno的时候,不要在其之前用到与系统调用相关的函数,比如之前的printf
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP