函数指针参数传递出函数内部数组地址
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));