汇总:柔性数组配合指针数组的方式,实现组包的逻辑的测试。
保存了收到的包,可以扩展结构体,对收到的包做处理。
在业务功能代码的实现中,涉及到组包的逻辑:
第一想法想到定义指针数组,用指针数组来实现包的判断以及重组。
配合结构体的柔性数组特性,这里尝试了一下实现方案:
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; }