免费注册 查看新帖 |

Chinaunix

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

一个关于memcpy的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-08 19:02 |只看该作者 |倒序浏览
在linux中有一个函数:
static int tdsync_queue_write(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, int id, void* private)
{
   ……
  write(prv->fd, buf, size);
  ……
}如此调用的话可以将buf中大小为 size的内容正确的写入硬盘。

但是,如果我加了一个memcpy,如下所示:
static int tdsync_queue_write(struct disk_driver *dd, uint64_t sector, int nb_sectors, char *buf, int id, void* private)
{
   ……
  listNode = (page_node_t *)malloc(sizeof(page_node_t));
   memset(listNode->buf, '\0', BUF_SIZE);// 此句写与不写不影响结果
  memcpy(listNode->buf, buf, size);
  write(prv->fd, listNode->buf, size);
   ……
}如此调用则write返回-1,并且errno的值为22.

其中 page_node_t结构的定义如下:
#define BUF_SIZE    4096
typedef struct page_node{
      uint64_t    offset;
      unsigned  int size;
      char          buf[BUF_SIZE];
      struct       page_node *next;
      struct       page_node *prev;
  }page_node_t;

size的值为1024、2048、4096等 但不会超过4096。
我觉得用memcpy之后buf和listNode->buf中的内容应该是一样的呀,为什么后者写入的时候会出错呢?百思不得其解,求各位大侠帮助!

论坛徽章:
0
2 [报告]
发表于 2010-10-08 19:32 |只看该作者
这个问题看起来很玄乎,我帮顶一下。

论坛徽章:
0
3 [报告]
发表于 2010-10-08 23:29 |只看该作者
看 errno ,应该是listNode->buf 的值非法。
打印一下  listNode->buf 和 size 的值看看是否合理。

论坛徽章:
0
4 [报告]
发表于 2010-10-09 11:16 |只看该作者
回复 3# linyunxian


    我打印过listNode->buf的内容,和buf是一模一样的!而且size也没问题。
   我把char buf[BUF_SIZE]换成char *buf,然后再需要的时候用 buf = (char *)malloc(sizeof(char)*size);
    发现还是出现同样的问题,只有极少数情况下write调用能够成功。

论坛徽章:
0
5 [报告]
发表于 2010-10-09 17:54 |只看该作者
我个人觉得是踩内存了,代码上是看是没有问题的

可能是之前某个地方踩了,但没有触发错误,然后加了这句导致了错误的触发

论坛徽章:
0
6 [报告]
发表于 2010-10-09 21:43 |只看该作者
我个人觉得是踩内存了,代码上是看是没有问题的

可能是之前某个地方踩了,但没有触发错误,然后加了这句 ...
Logic0 发表于 2010-10-09 17:54



    “踩内存”?不太明白,能讲具体一点吗?谢谢!

论坛徽章:
0
7 [报告]
发表于 2010-10-10 10:12 |只看该作者
我建议, 先把传给write的buf移到全局去测试一下, 或许会有意想不到的发现.

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
8 [报告]
发表于 2010-10-10 12:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2010-10-11 08:47 |只看该作者
回复 6# rick_cheung

就是内存越界了,以前遇到类似的问题,加一句就错,不加就不错的情况

论坛徽章:
0
10 [报告]
发表于 2010-10-11 10:41 |只看该作者
#define        EINVAL                22        /* Invalid argument */


buf是怎么定义的?

加打印看看sizeof(page_node_t))是否和size一致。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP