经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
用结构体解析Pascal字符串
来源:cnblogs  作者:Ack麦子  时间:2019/10/9 8:55:22  对本文有异议

来源:https://www.cnblogs.com/qiuyuwutong/p/8708844.html

1、什么是柔性数组?

柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建柔性数组。

2、柔性数组有什么用途 ?

它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。

3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名

本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们

可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

 

有如下的Pascal字符串:

 

 

  1. 1 //利用结构体读取Pascal串
  2. 2
  3. 3 #include <stdlib.h>
  4. 4 #include <stdio.h>
  5. 5
  6. 6 struct StrPascal
  7. 7 {
  8. 8 unsigned short int nLength;
  9. 9 char string[0]; //结构体中柔性数组
  10. 10 };
  11. 11
  12. 12 int main()
  13. 13 {
  14. 14 unsigned char PascalData[48] = {
  15. 15 0x0C, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0D, 0x00,
  16. 16 0x77, 0x77, 0x77, 0x2E, 0x70, 0x65, 0x64, 0x69, 0x79, 0x2E, 0x63, 0x6F, 0x6D, 0x04, 0x00, 0x6A,
  17. 17 0x6A, 0x79, 0x79, 0x03, 0x00, 0x43, 0x2B, 0x2B, 0x06, 0x00, 0x62, 0x61, 0x63, 0x6B, 0x65, 0x72
  18. 18 };
  19. 19
  20. 20 struct StrPascal *pStrPascal = (struct StrPascal *)PascalData; //定义结构体指针,并赋值强转后的数组指针
  21. 21
  22. 22 while ((int)pStrPascal < (int)PascalData + sizeof(PascalData)) //指针数值小于 原数组首地址加总大小 则继续
  23. 23 {
  24. 24 for (int i = 0; i < pStrPascal->nLength; i++) //按数组中存放的字符串长度输出
  25. 25 {
  26. 26 putchar(pStrPascal->string[i]);
  27. 27 }
  28. 28
  29. 29 //指针重新赋值 当前指针地址 + 2个字节(存储字符串长度所占用的内存空间) + 当前字符串长度
  30. 30 pStrPascal = (struct StrPascal *)((int)pStrPascal + sizeof(pStrPascal->nLength) + pStrPascal->nLength);
  31. 31 puts("");
  32. 32 }
  33. 33
  34. 34 system("pause");
  35. 35 return 0;
  36. 36 }

运行结果:

 

原文链接:http://www.cnblogs.com/bianyachao/p/11637424.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号