码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-01-30 17:47:38      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:c语言   struct   柔性数组   

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

一般的做法是定义一个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;
}


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

标签:c语言   struct   柔性数组   

原文地址:http://blog.csdn.net/xufeng0991/article/details/43307819

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!