用结构体解析Pascal字符串
来源:https://www.cnblogs.com/qiuyuwutong/p/8708844.html
1、什么是柔性数组?
柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建柔性数组。
2、柔性数组有什么用途 ?
它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。
3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名
本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们
可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!
//
柔性数组在C99中的定义是:
6.7.2.1 Structure and union specifiers
As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.
在至少两个成员的结构体中,最后一个成员其类型若是不完整类型的数组类型,则该成员称为柔性数组。
柔性数组的特点:
柔性数组作为不完整类型,即使用struct s test定义了变量test之后,sizeof (test.str)肯定是不行的。哪怕给str分配了空间也不行。
因为标准规定sizeof的操作数不可以是不完整类型(还有函数类型及位字段)。
所以sizeof (struct s)或sizeof (test),不算上柔性数组str占的空间,也是情理之中了。(如果在GCC中,单独测试array[0],则显示其占空间为0字节)
简而言之,柔性数组只是把符号(名字)放在结构体内(压根儿就没定义),方便使用.或->语法来操作柔性数组,其所占内存空间(定义时分配)并不算在结构体变量中。
有如下的Pascal字符串:

//利用结构体读取Pascal串 #include <stdlib.h>
#include <stdio.h> struct StrPascal
{
unsigned short int nLength;
char string[]; //结构体中柔性数组
}; int main()
{
unsigned char PascalData[] = {
0x0C, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0D, 0x00,
0x77, 0x77, 0x77, 0x2E, 0x70, 0x65, 0x64, 0x69, 0x79, 0x2E, 0x63, 0x6F, 0x6D, 0x04, 0x00, 0x6A,
0x6A, 0x79, 0x79, 0x03, 0x00, 0x43, 0x2B, 0x2B, 0x06, 0x00, 0x62, 0x61, 0x63, 0x6B, 0x65, 0x72
}; struct StrPascal *pStrPascal = (struct StrPascal *)PascalData; //定义结构体指针,并赋值强转后的数组指针 while ((int)pStrPascal < (int)PascalData + sizeof(PascalData)) //指针数值小于 原数组首地址加总大小 则继续
{
for (int i = ; i < pStrPascal->nLength; i++) //按数组中存放的字符串长度输出
{
putchar(pStrPascal->string[i]);
} //指针重新赋值 当前指针地址 + 2个字节(存储字符串长度所占用的内存空间) + 当前字符串长度
pStrPascal = (struct StrPascal *)((int)pStrPascal + sizeof(pStrPascal->nLength) + pStrPascal->nLength);
puts("");
} system("pause");
return ;
}
运行结果:

用结构体解析Pascal字符串的更多相关文章
- Golang通过结构体解析和封装XML
Golang解析和封装XML 解析XML成结构体Demo package main import ( "encoding/xml" "fmt" ) //我们通过 ...
- Go语言使用匿名结构体解析JSON数据
手机拥有屏幕.电池.指纹识别等信息,将这些信息填充为 JSON 格式的数据.如果需要选择性地分离 JSON 中的数据则较为麻烦.Go 语言中的匿名结构体可以方便地完成这个操作. 首先给出完整的代码,然 ...
- file_operations结构体解析 1
注:学了这么长时间了,还没有好好看看 file_operations机构体,这其中还有很多的东西,当你学着学着的时候,就会用到这里面的一些系统调用对应的函数了,我在网上搜索之后,记录如下,一边将来查看 ...
- golang 兼容不同json结构体解析实践
线上服务器,同一个web接口有时需要兼容不同版本的结构体.这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理. 如下,http接口调用者会传入不同的json结构数据(单 ...
- struct 结构体解析(原)
(一)基本概念 结构体是一个或是多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组合在一个名字之下.我们将关键字struct引入了结构声明中.结构声明包含在花括号内的一系列声明组成 ...
- XmlRpc.net 入参结构体嵌套的转义操作
项目使用C#开发,需要使用XmlRpc和Linux服务器端交互,用的是XmlRpc.net. 普通的程序调用入参和出差都没有问题,今天遇到入参结构体嵌套,结果 args 入参在服务器端不能解析.抓包数 ...
- [置顶] cJSON库(构建json与解析json字符串)-c语言
一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...
- Go第六篇之结构体剖析
Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类型可以被实例化,使用new或&a ...
- 使用 Go 的 struct tag 来解析版本号字符串
各类软件的版本号定义虽然都不尽相同,但是其基本原理基本上还是相通的:通过特写的字符对字符串进行分割.我们把这一规则稍作整理,放到 struct tag 中,告诉解析器如何解析,下面就以 semver ...
随机推荐
- eclipse对Java项目进行单元测试
一.右键项目名->buildpath->configure buildpath->add library->junit->选择版本(以4为例)->apply-> ...
- android studio学习---签名打包的两种方式
注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如果不知道签名是啥意思, ...
- 简单几招提速 Kotlin Kapt编译
https://droidyue.com/blog/2019/08/18/faster-kapt/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_ ...
- SAP常见查询组合
做SAP开发的,SELECT是必不可少的.新语法出了不少'新鲜'的语法,用法也是五花八门. 新语法有新语法的好处,老语法有老语法的优势. 新语法里把很多的逻辑处理,分组,排重,内表处理全都放到一些关键 ...
- FPM八:FPM TREE
先上效果图: 1,新建类:ZCL_FPM_TREE,并添加接口:IF_FPM_GUIBB,IF_FPM_GUIBB_TREE.激活所有方法 2.定义tree结构,在class的public secti ...
- Jmeter测试技巧
最近在用Jmeter做接口测试,使用中整理了一些组件的使用技巧. 一. 用户定义的变量 都是全局变量,无论是否在某个线程组或请求内,都是采用最新赋值的内容 二. 固定定时器 在单个请求内是让本请求线程 ...
- C++ 梳理:跑通简单程序
C++ 结合了三个编程流派: 过程式编程:C 特性,结构化语言,强调过程 面向对象编程:C++ 对于 C 语言的补充,一切皆对象,强调数据 泛型编程(generic programming):由 C+ ...
- destoon搜索伪静态失败解决办法
今天给一个朋友调试DT6.0内核的站点,搜索中文出现http 403 forbidden,找了半天,很纳闷,最后一个一个查看源代码总算找到,在此分享给大家! 解决的方法: 1.找到include/sa ...
- 小学四则运算口算练习app
目标: 第一次尝试做APP,这次做的东西不是很麻烦,做出一个口算练习的加减乘除的页面,使用者做题,设有答案页,进行核对! 核心部分是出题页面的程序,还有答案页的程序.不设置登录注册页面.冲刺时间:一周 ...
- Win10解决修改host没有权限问题(其他文件同理) 一步都不能少哦:先添加再授权
Step1:右键文件选择属性,选择安全,点击编辑: Step2:在弹窗中点击添加,在弹窗中点击高级: Step3:在弹窗中点击立即查找,选中当前用户,点击确定: Step4:此时选中用户已经被加入进来 ...