搜索
bottom↓
回复: 24

memcpy的使用导致进程崩溃问题

[复制链接]

出0入0汤圆

发表于 2019-12-24 08:15:41 | 显示全部楼层 |阅读模式
系统为linux

typedef struct test
{
        char ctest;
        char buf[31];
}testt;

void test()
{
testt kk,tt;


memcpy(&kk->ctest, &tt->ctest, sizeof(testt));//这样用出错

memcpy(&kk->ctest, &tt->ctest, sizeof(kk->ctest));
memcpy(&kk->buf, &tt->buf, sizeof(tt->buf));
//这样用就没问题
}
请大神们帮忙看一下什么问题,谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入22汤圆

发表于 2019-12-24 08:21:44 | 显示全部楼层
还用看吗,你sizeof的值是多少都还没搞清楚

出0入55汤圆

发表于 2019-12-24 08:25:46 来自手机 | 显示全部楼层
问题不是出在memcpy,而是出在sizeof(testt)上,结构体大小不能这么算,要算也是sizeof(test)

出0入0汤圆

发表于 2019-12-24 08:42:02 | 显示全部楼层
kk->ctest 不是指针不应该是.吗  ->能编译过?

出0入0汤圆

发表于 2019-12-24 08:44:31 | 显示全部楼层
jssd 发表于 2019-12-24 08:25
问题不是出在memcpy,而是出在sizeof(testt)上,结构体大小不能这么算,要算也是sizeof(test) ...

类型名不就是testt吗,为什么要sizeof(test),并且很多时候定义类型我都不写这个test。  试着加到编译器试了下sizeof(test)编译报错,test找不到声明

出0入4汤圆

发表于 2019-12-24 08:49:46 来自手机 | 显示全部楼层
&(kk.ctest),还是(&kk)->ctest

出0入0汤圆

发表于 2019-12-24 08:50:54 | 显示全部楼层
memcpy(&kk->ctest, &tt->ctest, sizeof( struct test));

出0入55汤圆

发表于 2019-12-24 09:00:57 | 显示全部楼层
风的微笑 发表于 2019-12-24 08:44
类型名不就是testt吗,为什么要sizeof(test),并且很多时候定义类型我都不写这个test。  试着加到编译器试 ...

你打印一下就知道啦。再说你的这个结构名和函数名一样了,真不好分

出0入0汤圆

发表于 2019-12-24 09:20:30 | 显示全部楼层
本帖最后由 风的微笑 于 2019-12-24 09:21 编辑
jssd 发表于 2019-12-24 09:00
你打印一下就知道啦。再说你的这个结构名和函数名一样了,真不好分


我是觉得不应该是test,以为记错了,然后照你说的sizeof(test),结果编译通不过。sizeof(testt)或sizeof(struct test)是可以的,打印出来都是32

出0入0汤圆

发表于 2019-12-24 09:27:54 | 显示全部楼层
memcpy(&(&kk)->ctest, &(&tt)->ctest, sizeof(testt));

出0入0汤圆

发表于 2019-12-24 09:28:11 | 显示全部楼层
memcpy(&kk.ctest, &tt.ctest, sizeof(testt));
这样呢?

出0入0汤圆

发表于 2019-12-24 09:31:49 | 显示全部楼层
不知道楼主想干嘛,如果是复制ctest,直接赋值就行,如果是复制整个结构体,为啥不&kk?

出5入8汤圆

发表于 2019-12-24 09:44:09 | 显示全部楼层
越界了吧

出0入0汤圆

发表于 2019-12-24 09:47:43 | 显示全部楼层
打印&的几个地址地址和sizeof长度,对比下,应该马上能定位到原因。

出0入0汤圆

 楼主| 发表于 2019-12-24 10:40:43 | 显示全部楼层
我打印了地址没有错,不可能是越界问题,我把memcpy改成memmove就没问题

出200入2554汤圆

发表于 2019-12-24 10:41:20 来自手机 | 显示全部楼层
前两条都是野指针好不好,LZ完全没有传正确指针给memcpy

出0入0汤圆

 楼主| 发表于 2019-12-24 10:42:53 | 显示全部楼层
上面的程序是我临时写的,公司的程序没法网上贴。我已经经过了多次实验,我在pc虚拟机和开发板上实验也没问题,只有公司的设备上出现这问题,所以有点蒙

出0入0汤圆

发表于 2019-12-24 10:44:38 | 显示全部楼层
楼主能编译通过?

出0入0汤圆

 楼主| 发表于 2019-12-24 11:04:49 | 显示全部楼层
XP85118978 发表于 2019-12-24 10:44
楼主能编译通过?

上面我只是举例说明一下,没编过,并且我觉得你们也很难复现

出0入0汤圆

发表于 2019-12-24 11:14:45 | 显示全部楼层
毕延吉 发表于 2019-12-24 11:04
上面我只是举例说明一下,没编过,并且我觉得你们也很难复现


memcpy(&kk, &tt, sizeof(testt));  
这样能错??

出0入0汤圆

发表于 2019-12-24 11:20:28 | 显示全部楼层
毕延吉 发表于 2019-12-24 11:04
上面我只是举例说明一下,没编过,并且我觉得你们也很难复现

你的目的就是两个结构体变量间的赋值,说白了,如果编译器支持度好,都是变量,赋值操作就跟一般常规标准变量的赋值方式 一样。

  1. uint8_t bVar1;
  2. uint8_t bVar2;
  3. struct tagTest
  4. {
  5.     uint8_t bMember1;
  6.     uint8_t bBuffer[31u];
  7. }tKK, tCC;

  8. bVar1 = bVar2; //常规变量赋值;
  9. tKK = tCC;        //结构体变量赋值; 但一般这样不保险,所以才用memcpy来实现结构体的赋值;
  10. memcpy(&tKK, &tCC, sizeof(struct tagTest));
复制代码

出0入0汤圆

发表于 2019-12-24 14:29:30 | 显示全部楼层
testt kk,tt;
&kk->ctest这里得到的只是ctest的值而不是ctest的地址吧?   &(kk.ctest)这样才是取得ctest的地址。

出0入0汤圆

发表于 2019-12-24 16:18:56 | 显示全部楼层
memcpy都用错了,还在纠结,要么
memcpy(&(&kk)->ctest, &(&tt)->ctest, sizeof(testt));
要么
memcpy(&kk.ctest, &tt.ctest, sizeof(testt));

memcpy要传地址,如果按你写法memcpy(&kk->ctest, &tt->ctest, sizeof(testt));
(&kk)->ctest取到的就不是地址,而是ctest的内容,如果&kk->ctest,KK后面只能用'.',根本编译不过

出0入20汤圆

发表于 2020-1-1 11:23:36 | 显示全部楼层
typedef struct test
{
char buf[31];      
char ctest;
}testt;
试试把数组写在前面呢?

出0入0汤圆

发表于 2020-1-6 12:55:08 | 显示全部楼层
memcpy(&kk->ctest, &tt->ctest, sizeof(testt));//这样用出错
把“->”改成“.”就可以了吧?而且用“->”是语法错误。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 18:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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