汇总:柔性数组配合指针数组的方式,实现组包的逻辑的测试。
保存了收到的包,可以扩展结构体,对收到的包做处理。
在业务功能代码的实现中,涉及到组包的逻辑:
第一想法想到定义指针数组,用指针数组来实现包的判断以及重组。
配合结构体的柔性数组特性,这里尝试了一下实现方案:
1:我可以保存每个包的地址,存储包头信息做校验实现。
涉及到的知识点:如何存储,目标是存储多个指针,个数是不定的(根据头信息解析)
char**a 是二级指针,其实就是指针的指针,初始化的时候注意不能直接用*a去赋值,要正确初始化。
char* data[] []的优先级高于*,是一个char* 数组,每个元素存储的都是一个char*
==》起始就是指针数组
其他: 数组指针,起始就是数组的指针,存放了一个数组的地址,+表示了加数组的长度
char (*pa)[4]; char[4](*pa);
2:这里可以用指针数组,参考柔性数组的逻辑实现我想要的功能:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
///怎么验证一下,存储结构体的指针的方案是对的
typedef struct test_t
{
int type;
char data;
}TEST_T;
//如果用data存储结构体的多个地址,是否可行?
typedef struct data_t
{
TEST_T* data[0]; //指向了数组的首地址 数组的大小由其他元素控制
}DATA_T;
//指针数组
int main()
{
DATA_T * tt = (DATA_T*)malloc(sizeof(char*)* 3);
for(int i =0; i<3; i++)
{
TEST_T * yy = (TEST_T*)malloc(sizeof(TEST_T));
yy->type = i;
tt->data[i] = yy;
}
for(int i=0;i<3;i++)
{
TEST_T * ret = tt->data[i];//数组的指针 这里如果用地址+1就会出问题
if(ret == NULL)
{
printf("ret is null. %d \n",i);
}else
{
printf("get ret success ret type %d, i %d \n", ret->type, i);
free(ret);
ret = NULL;
}
}
if(tt != NULL)
{
printf("free tt \n");
free(tt);
tt = NULL;
}
return 0;
}
3:指针其实就是地址,操作系统中地址的长度是固定的,
我试了一下,64位都是8字节,那么,是不是可以涉及通用一点的处理?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
///怎么验证一下,存储结构体的指针的方案是对的
typedef struct test_t
{
int type;
char data;
}TEST_T;
//如果用data存储结构体的多个地址,是否可行?
typedef struct data_t
{
char* data[0]; //指向了数组的首地址 数组的大小由其他元素控制
}DATA_T;
//指针数组
int main()
{
DATA_T * tt = (DATA_T*)malloc(sizeof(char*)* 3);
for(int i =0; i<3; i++)
{
TEST_T * yy = (TEST_T*)malloc(sizeof(TEST_T));
yy->type = i;
tt->data[i] = (char*)yy;
}
for(int i=0;i<3;i++)
{
TEST_T * ret = (TEST_T *)tt->data[i]; //数组的指针 这里如果用地址+1就会出问题
if(ret == NULL)
{
printf("ret is null. %d \n",i);
}else
{
printf("get ret success ret type %d, i %d \n", ret->type, i);
free(ret);
ret = NULL;
}
}
if(tt != NULL)
{
printf("free tt \n");
free(tt);
tt = NULL;
}
return 0;
}