问题记录:c 调用外接函数,获取结构体指针,失败,指针传参,会出现问题

这个下面代码运行时候,获取 *data 返回BMS—ID指针,出错,但是返回数据大小正确!

/** 
 * @brief      获取BMS的电池ID 地址
 * @param      uint8_t *data 返回BMS—ID地址
 * @retval     返回BMS_ID的数据大小
 */
uint8_t Read_BMS_Data_ID(uint8_t *data)
{
	static uint8_t 	*p;
	p = &(BMS_Data_ID.mName1);
	printf(" p = %p\r\n",p);
//	my_mem_copy(data,&(BMS_Data_ID.mName1),sizeof(BMS_Data_ID));	//复制ID信息1-13 26
	data = p;
	return (uint8_t)sizeof(BMS_Data_ID);
}

调用代码,这里一开始怀疑是static 定义问题,用了静态变量和局部动态变量,分别调用函数,获取ID指针,结果都是失败

	static	uint8_t   *ID_Data;
	uint8_t		BMS_ID_Len = Read_BMS_Data_ID(ID_Data);
//	HAL_Delay(100);
	printf(" ID_Data = %p		BMS_ID_Len = %d\r\n",ID_Data,BMS_ID_Len);
	
	uint8_t   *ID_Dat;
	uint8_t		BMS_ID_Le = Read_BMS_Data_ID(ID_Dat);
//	HAL_Delay(100);
	printf(" ID_Dat = %p		BMS_ID_Le = %d\r\n",ID_Dat,BMS_ID_Le);

运行结果是

思考:代码中取结构体ID地址应该没有问题,现在出现这个问题,怀疑是编译器优化。

但是 我这边是是修改调用函数,把指针返回,而不是用传参返回指针。

/** 
 * @brief      获取BMS的电池ID 地址
 * @param      uint8_t *len 返回BMS—ID数据长度
 * @retval     返回BMS_ID指针
 */
uint8_t *Read_pBMS_Data_ID(uint8_t *len)
{
	uint8_t 	*p;
	p = &(BMS_Data_ID.mName1);
	printf(" p = %p\r\n",p);
	*len = (uint8_t)sizeof(BMS_Data_ID);
	return  &(BMS_Data_ID.mName1);
}

调用

	uint8_t		BMS_ID_Len;
	uint8_t   *ID_Data	= Read_pBMS_Data_ID(&BMS_ID_Len);
	printf(" ID_Da = %p		BMS_ID_L = %d\r\n",ID_Data,BMS_ID_Len);	

运行结果,获取地址成功

总结;

1、外部接口函数,返回指针地址时候,尽量用返回方式,指针传参,会出现问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值