存地址实现组包逻辑的一个测试代码。

汇总:柔性数组配合指针数组的方式,实现组包的逻辑的测试。
保存了收到的包,可以扩展结构体,对收到的包做处理。

在业务功能代码的实现中,涉及到组包的逻辑:

​ 第一想法想到定义指针数组,用指针数组来实现包的判断以及重组。

配合结构体的柔性数组特性,这里尝试了一下实现方案:

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;
}

Guess you like

Origin blog.csdn.net/yun6853992/article/details/119915300