首页 > 代码库 > C语言变长消息定义:柔性数组
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 = http://www.mamicode.com/(char*)(m+1);>
有没有觉得时机上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 = http://www.mamicode.com/(char*)(m+1);>C语言变长消息定义:柔性数组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。