鱼C论坛

 找回密码
 立即注册
查看: 1929|回复: 13

memcpy的问题

[复制链接]
发表于 2021-11-18 00:59:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    char buff[100];
    int fd1 = open("message.txt", O_RDONLY);
    int length = 0;
    while (length = read(fd1, buff, sizeof(buff)) > 0)
    {
        
        char *data = (char *)malloc(104);
        memset(data, 0, 104);
        int dataLength = htonl(100);
        memcpy(data, &dataLength, 4);
        memcpy(data + 4, buff, 100);
        sendMessage(fd, data, 104);
        memset(buff, 0, sizeof(buff));
        free(data);
        data = NULL;
        usleep(1000);
    }

问题1:这里的length一直是1,为什么不是100?(message.txt有数据)
/问题2:gdb显示data一直是空,为什么buff的内容拷贝不到data中?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-18 01:00:21 | 显示全部楼层
困扰了一晚上,求大神指点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-18 01:00:55 | 显示全部楼层
求助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-18 09:26:49 | 显示全部楼层
while (length = read(fd1, buff, sizeof(buff)) > 0)
这个while里面的条件有问题,>的优先级高于=,所以在算完
read(fd1, buff, sizeof(buff)) > 0
后返回了true也就是1给length
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-18 23:11:55 | 显示全部楼层
洛阳城 发表于 2021-11-18 09:26
这个while里面的条件有问题,>的优先级高于=,所以在算完后返回了true也就是1给length

那第二个问题呢?data我申请了空间,buff里面gdb显示也有内容,为什么是空?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-19 00:11:46 | 显示全部楼层
1 #include <arpa/inet.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 void main()
  6 {
  7     int a = 1677721600;
  8     char *data = (char *)malloc(4);
  9     memcpy(data,&a,4);
10     printf("%d\n",*data);   
11 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-19 00:12:28 | 显示全部楼层
wuxianbiao 发表于 2021-11-19 00:11
1 #include
  2 #include
  3 #include

这里a是属于int的范围,为什么data打印出来是0?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-19 00:33:36 | 显示全部楼层
wuxianbiao 发表于 2021-11-19 00:11
1 #include
  2 #include
  3 #include

如果a=100,打印出来是100,但是1677721600应该也是在int的范围,为什么会这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-19 00:35:06 | 显示全部楼层
求助大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-19 09:38:54 | 显示全部楼层
wuxianbiao 发表于 2021-11-18 23:11
那第二个问题呢?data我申请了空间,buff里面gdb显示也有内容,为什么是空?

因为while循环一直是真,所以data一直在被修改,可能会导致你所说的异常。另外,你倒数第6行的fd在程序里面没有定义,你定义的是fd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-19 09:39:33 | 显示全部楼层
wuxianbiao 发表于 2021-11-19 00:12
这里a是属于int的范围,为什么data打印出来是0?

你这里的a已经超出int的取值范围了,要用long long才能放得下了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-19 09:47:25 | 显示全部楼层
本帖最后由 洛阳城 于 2021-11-19 09:49 编辑
wuxianbiao 发表于 2021-11-19 00:33
如果a=100,打印出来是100,但是1677721600应该也是在int的范围,为什么会这样?


仔细算了一下好像也没错,int有4 bytes,所以取值范围是-(2^31-1)~(2^31-1),也就是-2147483648~+2147483647,确实包含1677721600
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-21 09:23:58 | 显示全部楼层
洛阳城 发表于 2021-11-19 09:47
仔细算了一下好像也没错,int有4 bytes,所以取值范围是-(2^31-1)~(2^31-1),也就是-2147483648~+ ...

现在就是这个问题,fd是外面定义的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-21 09:36:09 | 显示全部楼层
求助中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-30 11:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表