C语言不定长消息之柔性数组
导语:C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面我们来看看C语言不定长消息之柔性数组,希望对大家有所帮助。
C语言不定长消息之柔性数组:柔性数组:数组大小待定的数组。C语言中结构体最后一个元素可以是大小未知的数组。C语言可以由结构体产生柔性数组。
柔性数组的结构如何只能堆上生成,柔性数组是C99的扩展,简而言之就是一个在struct结构里的.标识占位符不占结构struct的空间
在游戏前后端交换的过程中,经常会用到变成的消息体,因为有的内容的大小是位置的,例如一条微博,微博的内容大小是未知的。
一般的做法是定义一个char*类型的指针,然后指定其长度,代码如下:
1234typedef struct
unsigned len;
char
* pData;
Msg;
使用时:
12345678char
str[] =
"hello world!"
;
unsigned len = sizeofstr;
Msg* m = Msg*mallocsizeofMsg+len*sizeof
char
;
m->len = len;
m->pData =
char
*m+
1
;
memcpym+
1
, str, len;
printf
"%d, %s"
, m->len, m->pData;
有没有觉得时机上char* pData很多余呢?
因为数据时机的存储位置在m+1,我们可以直接得到这个指针,而不需要重新定义一个char* pData来报错这个位置。
这样带来了另一个问题就是,访问不方便,我们不能用结构体成员的方式来访问了,可以使用柔性数组,且看:
1234typedef struct
unsigned len;
char
data[];
Message;
使用起来就是这样
12345Message* msg = Message*mallocsizeofMessage + len*sizeof
char
;
msg->len = len;
memcpymsg->data, str, len;
printf
"%d, %s"
, msg->len, msg->data;
freemsg;
来分完整代码对比下:
123456789101112131415161718192021222324252627282930313233343536373839404142typedef struct
unsigned len;
char
* pData;
Msg;
typedef struct
unsigned len;
char
data[];
Message;
// 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 = sizeofstr;
// 普通用法
Msg* m = Msg*mallocsizeofMsg+len*sizeof
char
;
m->len = len;
m->pData =
char
*m+
1
;
memcpym+
1
, str, len;
printf
"%d, %s"
, m->len, m->pData;
freem;
// 柔性数组
Message* msg = Message*mallocsizeofMessage + len*sizeof
char
;
msg->len = len;
memcpymsg->data, str, len;
printf
"%d, %s"
, msg->len, msg->data;
freemsg;
system
"pause"
;
return
0
;
</string.h></stdlib.h></stdio.h>
附自己测试代码
12345678910111213141516171819202122232425262728293031323334#include <iostream>
using namespace std;
typedef struct
unsigned len;
char
* pData;
Msg;
typedef struct
unsigned len;
char
pData[];
Msg1;
int
main
void
Msg m;
cout << sizeofm << endl;
//16
cout << &m << endl;
// x
cout << &m.len << endl;
//x
cout << &m.pData << endl;
//x+8
//
cout <<
"-----"
<< endl;
Msg1 m1;
cout << sizeofm1 << endl;
//4
cout << &m1 << endl;
// x
cout << &m1.len << endl;
//x
cout << &m1.pData << endl;
//x+4
return
0
;
</iostream>
结果