毕延吉 发表于 2019-12-24 08:15:41

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

系统为linux

typedef struct test
{
        char ctest;
        char buf;
}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));//这样用就没问题
}
请大神们帮忙看一下什么问题,谢

jiaowoxiaolu 发表于 2019-12-24 08:21:44

还用看吗,你sizeof的值是多少都还没搞清楚

jssd 发表于 2019-12-24 08:25:46

问题不是出在memcpy,而是出在sizeof(testt)上,结构体大小不能这么算,要算也是sizeof(test)

风的微笑 发表于 2019-12-24 08:42:02

kk->ctest 不是指针不应该是.吗->能编译过?

风的微笑 发表于 2019-12-24 08:44:31

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

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

get500wan 发表于 2019-12-24 08:49:46

&(kk.ctest),还是(&kk)->ctest

ArthurBruin 发表于 2019-12-24 08:50:54

memcpy(&kk->ctest, &tt->ctest, sizeof( struct test));

jssd 发表于 2019-12-24 09:00:57

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

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

风的微笑 发表于 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

penny2799 发表于 2019-12-24 09:27:54

memcpy(&(&kk)->ctest, &(&tt)->ctest, sizeof(testt));

wangchin1988 发表于 2019-12-24 09:28:11

memcpy(&kk.ctest, &tt.ctest, sizeof(testt));
这样呢?

wangchin1988 发表于 2019-12-24 09:31:49

不知道楼主想干嘛,如果是复制ctest,直接赋值就行,如果是复制整个结构体,为啥不&kk?

wt3333 发表于 2019-12-24 09:44:09

越界了吧

niaojingxin 发表于 2019-12-24 09:47:43

打印&的几个地址地址和sizeof长度,对比下,应该马上能定位到原因。

毕延吉 发表于 2019-12-24 10:40:43

我打印了地址没有错,不可能是越界问题,我把memcpy改成memmove就没问题

t3486784401 发表于 2019-12-24 10:41:20

前两条都是野指针好不好,LZ完全没有传正确指针给memcpy

毕延吉 发表于 2019-12-24 10:42:53

上面的程序是我临时写的,公司的程序没法网上贴。我已经经过了多次实验,我在pc虚拟机和开发板上实验也没问题,只有公司的设备上出现这问题,所以有点蒙

XP85118978 发表于 2019-12-24 10:44:38

楼主能编译通过?

毕延吉 发表于 2019-12-24 11:04:49

XP85118978 发表于 2019-12-24 10:44
楼主能编译通过?

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

xf331785508 发表于 2019-12-24 11:14:45

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

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

xf331785508 发表于 2019-12-24 11:20:28

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

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

uint8_t bVar1;
uint8_t bVar2;
struct tagTest
{
    uint8_t bMember1;
    uint8_t bBuffer;
}tKK, tCC;

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

flamma 发表于 2019-12-24 14:29:30

testt kk,tt;
&kk->ctest这里得到的只是ctest的值而不是ctest的地址吧?   &(kk.ctest)这样才是取得ctest的地址。

penny2799 发表于 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后面只能用'.',根本编译不过

JIANGJIAYU 发表于 2020-1-1 11:23:36

typedef struct test
{
char buf;      
char ctest;
}testt;
试试把数组写在前面呢?

L_Hongzhen 发表于 2020-1-6 12:55:08

memcpy(&kk->ctest, &tt->ctest, sizeof(testt));//这样用出错
把“->”改成“.”就可以了吧?而且用“->”是语法错误。
页: [1]
查看完整版本: memcpy的使用导致进程崩溃问题