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

#include

#include

#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语言变长讯息定义:柔性数组相关推荐

  1. 整形在c语言中作用,C语言里面长整型起到什么作用?长整型的位数是怎么确定的?长整型...,C语言中长整形干什么用的...

    长整型数是相对于基本整型数而言的,一般它占用的存储空间是基本整型数的2倍. 具体大小随不同的编译器而不同. 如果它的存储空间是k个字节,可存储数的范围是-2^(8k-1)~+2^(8k-1)-1. 整 ...

  2. python3长整型怎么用_python3有长整型吗

    Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionary(字典) Number(数字) Py ...

  3. c语言double可以代表整型么,C语言中整型变量(int)实型变量(float)双精度变量(double)到底是什么东西?有什么区...

    整型[signed]int -2147483648~+2147483648 无符号整型unsigned[int] 0~4294967295 短整型 short [int] -32768~32768 无 ...

  4. java长整型时间转日期_C#长整型时间与java长整型时间转换

    最近在有一个解析并转发病毒软件日志的活,这个软件用的是SQLite嵌入式数据库存储病毒日志.查询病毒记录后,我发现它用长整型存储攻击时间这个字段,而且是一个10位的值.而我的解析系统是用C#写的,C# ...

  5. java长整型_java – 将整数转换为长整型

    我需要使用反射获得字段的值.这样发生,我不总是确定字段的数据类型.为了避免一些代码重复,我创建了以下方法: @SuppressWarnings("unchecked") priva ...

  6. C语言输出长长整型错误,c语言长整型定义

    我用long int怎么不行呢 基本定义形式为: long var_name = INIT_VALUE; 一. 长整型在C语言中类型关键字为long. 定义时,var_name为变量名. INIT_V ...

  7. java中怎么输入长整型_c语言如何输入长整型 scanf输入长整型

    C语言中无符号长整型数的输入输出格式是什么? 整数变量的分类:basic integer:int short integer:short int long int将修饰符unsigned添加到上述三个 ...

  8. python长整型是什么_Python【数据类型】

    我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,"汉"是文字否则它是分不清1和汉的区别的,因此 ...

  9. java长整型转换为整型_java ip地址转换为长整型

    java ip地址转换为长整型 java ip地址转换为长整型: public class Util { /** * 字符串ip转换为long * @param 字符串ip * @return */ ...

  10. c语言 long与integer,VB中Integer(整型)和Long(长整型)有什么区别?

    VB中Integer(整型)和Long(长整型)区别区别如下: 1.长度不同. Integer是int的封装类型是 32 位的整数,long 是 64 位的整数,表示范围:-2^63 ~ 2^63 - ...

最新文章

  1. mysql的索引的区别_MYSQL索引区别
  2. 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript
  3. Handler(2)
  4. Oracle PL/SQL进阶
  5. 2017.5.8 文化之旅 思考记录
  6. 主题:Hibernate/Spring/Struts架构使用OpenSessionInView的问题
  7. iphone以旧换新活动_一年当中什么时候买手机最便宜?|手机|优惠券|购物节|苹果手机|iphone...
  8. Numpy系列(一)array对象以及创建array的方法总结
  9. java 雪崩效应,Jmeter模拟雪崩效应
  10. FGSM对抗样本trick汇总
  11. XTU OJ 1395
  12. Android O 修改吉字节为GB
  13. 978_使用emacs lisp安装emacs插件
  14. 如何解决代理模式详解的原理详解
  15. VLC 中文显示乱码问题
  16. SEO外链收录:锚文本外链代发排名
  17. 如何识别一张图片中的字体,并复刻
  18. 使用机器学习来预测股票价格
  19. OPC UA JAVA开发笔记(四):数据写入
  20. 中国最有意境的33句

热门文章

  1. 论文笔记_S2D.08-2019-ICRA-使用非对称标注实时联合语义分割和深度估计
  2. SLAM和三维重建中的SFM区别
  3. 关于如何将DB2中的非空约束删除
  4. 最新!2020录取分数百强大学榜发布:清华文科第一,北大理科第一!
  5. mysql复制以及一主多从等常见集群概述
  6. 2016.05.17开通自己的博客
  7. [LeetCode] Reverse Linked List 倒置链表
  8. perl学习二:简单变量
  9. 基于二进制粒子群算法的配电网故障诊断- 附代码
  10. 【LeetCode】【数组】题号:*598,范围求和