用结构体解析Pascal字符串

下面我们来看看关于柔性数组的资料:

1、什么是柔性数组?

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

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

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

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

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

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

 

有如下的Pascal字符串:

#include <stdio.h>
struct tagPascal
{
    unsigned short int m_nLength;
    char str[1];
}; //柔性数组


int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char data[48] = {
        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, 0x63, 0x6F, 0x70, 0x79, 0x54, 0x6F
    };

    struct tagPascal *pPascal = (struct tagPascal * )data;

    while ((size_t)pPascal < (size_t)data + sizeof(data))
    {
        for (int i = 0; i < pPascal->m_nLength; i++)
        {
            putchar(pPascal->str[i]);
        }

        pPascal = (tagPascal *)((int)pPascal + sizeof(pPascal->m_nLength) + pPascal->m_nLength);
        puts("");
    }

    return 0;
}

下面我们来看看结果:

  

 

posted on 2018-04-03 15:38  秋雨丶梧桐  阅读(893)  评论(0编辑  收藏  举报

导航