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;
}
时间: 2024-11-05 21:07:58

C语言变长消息定义:柔性数组的相关文章

C 语言变长数组 struct 中 char data[0] 的用法

1.结构体内存布局(padding) 为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制.这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足:第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充. The following typical alignments are va

C语言变长数组 struct中char data[0]的用法

版权声明:本文为博主原创文章,未经博主允许不得转载. [cpp] view plain copy print? 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用struct实现变长数组的技术.下面是我在网上找到的一篇讲解很清楚的文章. 在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组.此时,我们可以使用结构体的方法实现C语言变长数组. struct MyData { int nL

C语言变长数组data[0]

转载:http://www.cnblogs.com/Anker/p/3744127.html 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到 data[0].这样设计的目的是让数组长度是可变的,根据需要进行分配.方便操作,节省空间. 2.data[0]结构 经常遇到的结构形状如下: struct buffer { int data_len; //长度

C语言变长參数的认识以及宏实现

1.认识 变长參数是C语言的特殊參数形式.比如例如以下函数声明: int printf(const char *format, ....); 如此的声明表明,printf函数除了第一个參数类型为const char*之外,其后能够追加随意数量.随意类型的參数. printf的实现,粗略地举个样例. 如果lastarg是变长參数函数的最后一个具名參数(比如printf里的format),那么在函数内部定义类型的va_list的变量: va_list ap; 该变量以后将会依次指向各个可变參数. a

C语言--变长参数

一.  实现原理 首先变长参数的实现依赖于cdecl调用,因为其规定了出栈方为函数调用方,从而解决被调用函数无法确定参数个数,其次cdecl规定参数入栈顺序为从右到左.所以第一个不定参数位于栈顶 二. 宏源码讲解  (va ---> variable-argument(可变参数)) 头文件 stdarg.h 2.1 va_list #define va_list char * 定义了一个指针arg_ptr, 用于指示可选的参数. 2.2 va_start(arg_ptr, argN) #defi

c语言变长数组

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <time.h> #include <unistd.h> typedef struct score_s{ char name[20]; int scores[0]; }score; int main() { score *scoreInfo = malloc(

c语言,变长数组

C语言变长数组data[0][总结]: char data[0]用法总结:

C语言柔性数组和动态数组

[前言]经常看到C语言里的两个数组,总结一下. 一.柔性数组 参考:https://www.cnblogs.com/veis/p/7073076.html #include<stdio.h> typedef struct _SoftArray{ int len; int array[]; }SoftArray; int main() { int len = 10; printf("The struct's size is %d\n",sizeof(SoftArray));

Java语法糖初探(三)--变长参数

变长参数概念 在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用.形如 function(T -args).但是需要明确的一点是,java方法的变长参数只是语法糖,其本质上还是将变长的实际参数 varargs 包装为一个数组. 看下面的例子: 12345678910111213 public class VariVargs { public static void main(String []args) { tes