函数指针参数传递出函数内部数组地址及结构体问题汇总(内部数组分段拷贝+动态可变长结构体)

函数指针参数传递出函数内部数组地址

1、定义二维数组

char InBuf[MAX_CARD][MAX_LEN_R]char spec_InBuf[4][200]={0};

2、通过函数读出数组值

void SLDMpi_Get_Recbuf(unsigned long card_no, char *recbuf, char **recbuf_ID)
{
	*recbuf_ID=spec_InBuf[0];//直接传递数组地址;
	memcpy(recbuf,&InBuf[card_no], MAX_LEN_R);//通过内存拷贝复制数组;
}

3、测试实例

CString str;
char *recbuf_ID=NULL;
char recbuf[500]={0};
SLDMpi_Get_Recbuf(card_no[0],recbuf,&recbuf_ID);

for(int i=0;i<n;i++)//取出前n个数据
{
	str.Format(_T("%x"),(unsigned char)recbuf[i]);
	str.Format(_T("%x"),*(recbuf_ID+i));
	//16进制输出到str
}

注意:改变recbuf_ID地址块中的数据,将改变函数内部spec_InBuf数组对应地址指向的数据,一般不建议这样使用。本实例只做数据取出显示。

另外还有个问题,recbuf_ID这个指针在一个测试函数内部定义,要释放吗?
答:recbuf_ID没有用new分配内存,不需要释放。

memcpy结构体内部数组分段拷贝

#define MAX_ALM_BUFFER_NUM          256//最大数组长度
#define MAX_CARD_NO					16//最大组数
int total_alarm_history=0 ;//总写入指针,超过最大数组数后,从0开始循环写入
int p_alarm_history=0;//当前写入指针
typedef struct
{
	int Alarm_number[MAX_ALM_BUFFER_NUM];
	int Alarm_para[MAX_ALM_BUFFER_NUM];
	int sys_tick[MAX_ALM_BUFFER_NUM];
}Alarm_History;
Alarm_History alarm_history[MAX_CARD_NO];

SLDMpi_Get_Alarm_History(unsigned long card_no,Alarm_History *p_alarmhistory)
{
//数组数据从前往后依次排序copy出数据
	if(total_alarm_history > (MAX_ALM_BUFFER_NUM-1))//超过最大数,先copy当前指针后面的数据到p_alarmhistory的前段
	{
		memcpy(p_alarmhistory, &(alarm_history[card_no].Alarm_number[0]) + p_alarm_history, (MAX_ALM_BUFFER_NUM-p_alarm_history)*sizeof(int));
		memcpy(&(p_alarmhistory->Alarm_para), &(alarm_history[card_no].Alarm_para[0]) + p_alarm_history, (MAX_ALM_BUFFER_NUM-p_alarm_history)*sizeof(int));
		memcpy(&(p_alarmhistory->sys_tick), &(alarm_history[card_no].sys_tick[0]) + p_alarm_history, (MAX_ALM_BUFFER_NUM-p_alarm_history)*sizeof(int));

		if(p_alarm_history !=0)//从前依次copy到当前指针处数据到p_alarmhistory的后段
		{
			memcpy(&(p_alarmhistory->Alarm_number[0])+(MAX_ALM_BUFFER_NUM-p_alarm_history), &alarm_history[card_no].Alarm_number, p_alarm_history*sizeof(int));
			memcpy(&(p_alarmhistory->Alarm_para[0])+(MAX_ALM_BUFFER_NUM-p_alarm_history), &alarm_history[card_no].Alarm_para, p_alarm_history*sizeof(int));
			memcpy(&(p_alarmhistory->sys_tick[0])+(MAX_ALM_BUFFER_NUM-p_alarm_history), &alarm_history[card_no].sys_tick, p_alarm_history*sizeof(int));
		}
	}
	else
	{
		//	memcpy(p_alarmhistory, &alarm_history[card_no], sizeof(Alarm_History));//整个copy
		*p_alarmhistory=alarm_history[card_no];
	}

	return total_alarm_history;//返回总数据数,大于MAX_ALM_BUFFER_NUM的数据丢弃

}

注意:memcpy的前两个参数内存地址指针不要*sizeof(int),第三个数据大小要*sizeof(int)

memcpy将结构体数组从第i位开始拷贝以后的数据到结构体头

typedef struct 
{
	unsigned char main_code;
	unsigned char sub_code;
	unsigned char code_num;
	unsigned char reserve;
	PARA_DATA union_paradata[MAX_FUNPARA_NUM];
	//	unsigned char checksum;
}FUNCTION_STRUCT; 
FUNCTION_STRUCT function_struct[MAX_FUNCTION_NUM];
//*function_p当前构体数组有效数据个数 *function_p<MAX_FUNCTION_NUM

memcpy(function_struct,&function_struct[i+1],(sizeof(FUNCTION_STRUCT))*(*function_p -i));

不必用多一个中间结构数组转换,如下:

FUNCTION_STRUCT *temp_function_struct = new  FUNCTION_STRUCT[*function_p -i+1];//这样是动态数组,用指针方式,分配的小一些
//FUNCTION_STRUCT temp_function_struct[MAX_FUNCTION_NUM] ={0};//= new  FUNCTION_STRUCT;//这样是用数组的,原来是这样,分配到最大
memcpy(&temp_function_struct[0].main_code,&function_struct[k].main_code,(sizeof(FUNCTION_STRUCT))*(*function_p -i));//把剩余数据移位到前面,
memcpy(&function_struct[0].main_code,&temp_function_struct[0].main_code,(sizeof(FUNCTION_STRUCT))*(*function_p -i));

C语言实现动态可变长结构体

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值