C语言变长消息定义:柔性数组 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    在游戏前后端交换的过程中,经常会用到变成的消息体,因为有的内容的大小是位置的,例如一条微博,微博的内容大小是未知的,

C语言变长消息定义:柔性数组

    一般的做法是定义一个char*类型的指针,然后指定其长度,代码如下:

   

typedef struct{	unsigned len;	char* pData;}Msg;

    使用的时候是这样的:

   

char str[] = "hello world!";	unsigned len = sizeof(str);	Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));	m->len = len;	m->pData = (char*)(m+1);	memcpy(m+1, str, len);	printf("%d, %s\n", m->len, m->pData);

    有没有觉得时机上char* pData很多余呢?

    因为数据时机的存储位置在m+1,我们可以直接得到这个指针,而不需要重新定义一个char* pData来报错这个位置。

    这样带来了另一个问题就是,访问不方便,我们不能用结构体成员的方式来访问了,可以使用柔性数组,且看:

   

typedef struct{	unsigned len;	char data[];}Message;

    使用起来就是这样的:

   

Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));	msg->len = len;	memcpy(msg->data, str, len);	printf("%d, %s\n", msg->len, msg->data);	free(msg);

    来分完整代码对比下:

    // array0.h

   

typedef struct{	unsigned len;	char* pData;}Msg;typedef struct{	unsigned len;	char data[];}Message;

    // main.c

   

// test for 0 size array#include<stdio.h>#include<stdlib.h>#include<string.h>#include "array0.h"int main(){	char str[] = "hello world!";	unsigned len = sizeof(str);	// 普通用法	Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));	m->len = len;	m->pData = (char*)(m+1);	memcpy(m+1, str, len);	printf("%d, %s\n", m->len, m->pData);	free(m);	// 柔性数组	Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));	msg->len = len;	memcpy(msg->data, str, len);	printf("%d, %s\n", msg->len, msg->data);	free(msg);	system("pause");	return 0;}

最新文章