memcpy的使用导致进程崩溃问题
系统为linuxtypedef 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));//这样用就没问题
}
请大神们帮忙看一下什么问题,谢 还用看吗,你sizeof的值是多少都还没搞清楚 问题不是出在memcpy,而是出在sizeof(testt)上,结构体大小不能这么算,要算也是sizeof(test) kk->ctest 不是指针不应该是.吗->能编译过? jssd 发表于 2019-12-24 08:25
问题不是出在memcpy,而是出在sizeof(testt)上,结构体大小不能这么算,要算也是sizeof(test) ...
类型名不就是testt吗,为什么要sizeof(test),并且很多时候定义类型我都不写这个test。试着加到编译器试了下sizeof(test)编译报错,test找不到声明 &(kk.ctest),还是(&kk)->ctest memcpy(&kk->ctest, &tt->ctest, sizeof( struct test)); 风的微笑 发表于 2019-12-24 08:44
类型名不就是testt吗,为什么要sizeof(test),并且很多时候定义类型我都不写这个test。试着加到编译器试 ...
你打印一下就知道啦。再说你的这个结构名和函数名一样了,真不好分 本帖最后由 风的微笑 于 2019-12-24 09:21 编辑
jssd 发表于 2019-12-24 09:00
你打印一下就知道啦。再说你的这个结构名和函数名一样了,真不好分
我是觉得不应该是test,以为记错了,然后照你说的sizeof(test),结果编译通不过。sizeof(testt)或sizeof(struct test)是可以的,打印出来都是32 memcpy(&(&kk)->ctest, &(&tt)->ctest, sizeof(testt)); memcpy(&kk.ctest, &tt.ctest, sizeof(testt));
这样呢? 不知道楼主想干嘛,如果是复制ctest,直接赋值就行,如果是复制整个结构体,为啥不&kk? 越界了吧 打印&的几个地址地址和sizeof长度,对比下,应该马上能定位到原因。 我打印了地址没有错,不可能是越界问题,我把memcpy改成memmove就没问题
前两条都是野指针好不好,LZ完全没有传正确指针给memcpy 上面的程序是我临时写的,公司的程序没法网上贴。我已经经过了多次实验,我在pc虚拟机和开发板上实验也没问题,只有公司的设备上出现这问题,所以有点蒙 楼主能编译通过? XP85118978 发表于 2019-12-24 10:44
楼主能编译通过?
上面我只是举例说明一下,没编过,并且我觉得你们也很难复现 毕延吉 发表于 2019-12-24 11:04
上面我只是举例说明一下,没编过,并且我觉得你们也很难复现
memcpy(&kk, &tt, sizeof(testt));
这样能错?? 毕延吉 发表于 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));
testt kk,tt;
&kk->ctest这里得到的只是ctest的值而不是ctest的地址吧? &(kk.ctest)这样才是取得ctest的地址。 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后面只能用'.',根本编译不过
typedef struct test
{
char buf;
char ctest;
}testt;
试试把数组写在前面呢? memcpy(&kk->ctest, &tt->ctest, sizeof(testt));//这样用出错
把“->”改成“.”就可以了吧?而且用“->”是语法错误。
页:
[1]