C语言定义定长整型数组,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 = (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语言变长讯息定义:柔性数组相关推荐
- 整形在c语言中作用,C语言里面长整型起到什么作用?长整型的位数是怎么确定的?长整型...,C语言中长整形干什么用的...
长整型数是相对于基本整型数而言的,一般它占用的存储空间是基本整型数的2倍. 具体大小随不同的编译器而不同. 如果它的存储空间是k个字节,可存储数的范围是-2^(8k-1)~+2^(8k-1)-1. 整 ...
- python3长整型怎么用_python3有长整型吗
Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionary(字典) Number(数字) Py ...
- c语言double可以代表整型么,C语言中整型变量(int)实型变量(float)双精度变量(double)到底是什么东西?有什么区...
整型[signed]int -2147483648~+2147483648 无符号整型unsigned[int] 0~4294967295 短整型 short [int] -32768~32768 无 ...
- java长整型时间转日期_C#长整型时间与java长整型时间转换
最近在有一个解析并转发病毒软件日志的活,这个软件用的是SQLite嵌入式数据库存储病毒日志.查询病毒记录后,我发现它用长整型存储攻击时间这个字段,而且是一个10位的值.而我的解析系统是用C#写的,C# ...
- java长整型_java – 将整数转换为长整型
我需要使用反射获得字段的值.这样发生,我不总是确定字段的数据类型.为了避免一些代码重复,我创建了以下方法: @SuppressWarnings("unchecked") priva ...
- C语言输出长长整型错误,c语言长整型定义
我用long int怎么不行呢 基本定义形式为: long var_name = INIT_VALUE; 一. 长整型在C语言中类型关键字为long. 定义时,var_name为变量名. INIT_V ...
- java中怎么输入长整型_c语言如何输入长整型 scanf输入长整型
C语言中无符号长整型数的输入输出格式是什么? 整数变量的分类:basic integer:int short integer:short int long int将修饰符unsigned添加到上述三个 ...
- python长整型是什么_Python【数据类型】
我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,"汉"是文字否则它是分不清1和汉的区别的,因此 ...
- java长整型转换为整型_java ip地址转换为长整型
java ip地址转换为长整型 java ip地址转换为长整型: public class Util { /** * 字符串ip转换为long * @param 字符串ip * @return */ ...
- c语言 long与integer,VB中Integer(整型)和Long(长整型)有什么区别?
VB中Integer(整型)和Long(长整型)区别区别如下: 1.长度不同. Integer是int的封装类型是 32 位的整数,long 是 64 位的整数,表示范围:-2^63 ~ 2^63 - ...
最新文章
- mysql的索引的区别_MYSQL索引区别
- 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript
- Handler(2)
- Oracle PL/SQL进阶
- 2017.5.8 文化之旅 思考记录
- 主题:Hibernate/Spring/Struts架构使用OpenSessionInView的问题
- iphone以旧换新活动_一年当中什么时候买手机最便宜?|手机|优惠券|购物节|苹果手机|iphone...
- Numpy系列(一)array对象以及创建array的方法总结
- java 雪崩效应,Jmeter模拟雪崩效应
- FGSM对抗样本trick汇总
- XTU OJ 1395
- Android O 修改吉字节为GB
- 978_使用emacs lisp安装emacs插件
- 如何解决代理模式详解的原理详解
- VLC 中文显示乱码问题
- SEO外链收录:锚文本外链代发排名
- 如何识别一张图片中的字体,并复刻
- 使用机器学习来预测股票价格
- OPC UA JAVA开发笔记(四):数据写入
- 中国最有意境的33句