OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4152|回复: 6

关于memcpy使用报错的问题!

[复制链接]

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2020-2-28 17:44:21 | 显示全部楼层 |阅读模式
10金钱
环境:windows+keil我定义了一个结构体,用__packed使其1字节对齐如下:
typedef __packed struct A
{
  uint32_t  X1;
  uint32_t  X2;
}B;
定义一个结构体:
B test = {0};

然后我定义了一个uint8_t*指针为其开辟了一块缓存用于存储数据;
uint8_t *p;//用pvPortMalloc()分配了足够的内存

最后调用函数memcpy进行赋值:
memcpy(p,&test .X1,4);

此时报错
无标题.png
但是当我把结构体的1字节对齐__packed去掉后,就可以了;memcpy使用时对地址对齐有什么要求吗?

最佳答案

查看完整内容[请看2#楼]

在前面加强制转换试试
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-2-28 17:44:22 | 显示全部楼层
在前面加强制转换试试
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6737
金钱
6737
注册时间
2017-4-12
在线时间
1258 小时
发表于 2020-2-29 16:14:51 | 显示全部楼层
#include <stdio.h>
#include <stdint.h>

#pragma pack(1)   // start struct/union memory align size is 1 byte
typedef  struct
{
        uint32_t  X1;
        uint32_t  X2;
}B;
#pragma pack()  //end start struct/union memory align

B test = { 0 };


uint8_t *p;//用pvPortMalloc()分配了足够的内存


void main()
{
        p = (uint8_t *)malloc(100);
        memcpy(p, &test.X1, 4);
        system("pause");
}

visual studio 2015跑没有报错
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2020-3-2 09:04:06 | 显示全部楼层

那就很奇怪了 和编译器还有关系吗
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2020-3-2 09:05:02 | 显示全部楼层
正点原子 发表于 2020-2-28 23:21
在前面加强制转换试试

uint32_t *试过了 都是报一样的错 再研究研究
回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2020-3-2 11:44:22 | 显示全部楼层
本帖最后由 陈皮皮 于 2020-3-2 11:57 编辑
正点原子 发表于 2020-2-28 23:21
在前面加强制转换试试


我测试了一下 memcpy(p, (void*)&test.X1, 4);没有报错,运行结果也正确;
void *memcpy(void *destin, void *source, unsigned n);这是memcpy原函数,第二个参数不用强制转化应该也对的啊;
虽然解决了,但是还是没弄清楚,为什么去掉__packed就不会报#167这个错了!





回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
 楼主| 发表于 2020-3-4 10:07:24 | 显示全部楼层
陈皮皮 发表于 2020-3-2 11:44
我测试了一下 memcpy(p, (void*)&test.X1, 4);没有报错,运行结果也正确;void *memcpy(void *destin,  ...

可能就是编译器原因,没有强制转化,编译器没办法识别__packed所以报错
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-7 15:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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