精华内容
下载资源
问答
  • 变长结构体

    2020-04-17 17:24:18
    文章目录什么是变长结构体定义变长结构体变长结构体实例参考资料 什么是变长结构体 变长结构体是由gcc扩展的一种技术,它是指其最后一个成员的长度不固定(flexible array member,也叫柔性数组)。 使用范围:数据...

    什么是变长结构体

    变长结构体是由gcc扩展的一种技术,它是指其最后一个成员的长度不固定(flexible array member,也叫柔性数组)。

    使用范围:数据长度不固定,例如协议对接中有固定的头结构体,数据结构体不固定。

    定义变长结构体

    struct MyData 
    {
        int nLen;
        char data[0];
    };
    

    struct MyData 
    {
        int nLen;
        char data[];
    };
    

    变长结构体实例

    实例1:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    
    using namespace std;
    
    typedef struct
    {
    	unsigned int optType;
    	unsigned int err;
    	unsigned int command;
    	unsigned char data[0]; /*0-61440, 扩展负载数据,用于传递命令的请求输入或应答输出*/
    }DataHead_V1;
    
    typedef struct
    {
    	unsigned int optType;
    	unsigned int err;
    	unsigned int command;
    	unsigned char data[];
    }DataHead_V2;
    
    typedef struct
    {
    	unsigned int optType;
    	unsigned int err;
    	unsigned int command;
    	unsigned char data[1];
    }DataHead_V3;
    
    typedef struct
    {
    	unsigned int optType;
    	unsigned int err;
    	unsigned int command;
    	unsigned char *pdata;
    }DataHead_V4;
    
    int main()
    {
    	printf("sizeof(DataHead_V1) = %lu\n", sizeof(DataHead_V1));
    	printf("sizeof(DataHead_V2) = %lu\n", sizeof(DataHead_V2));
    	printf("sizeof(DataHead_V3) = %lu\n", sizeof(DataHead_V3));
    	printf("sizeof(DataHead_V4) = %lu\n", sizeof(DataHead_V4));
        return 0;
    }
    

    实例2:协议传输发送/解析

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    
    using namespace std;
    
    typedef struct
    {
    	unsigned int optType;
    	unsigned int err;
    	unsigned int command;
    	unsigned char data[0]; /*0-61440, 扩展负载数据,用于传递命令的请求输入或应答输出*/
    }DataHead;
    
    typedef struct
    {
    	unsigned char devicename[64];
    }DeviceInfo;
    
    
    int main()
    {
    	printf("sizeof(DataHead) = %lu\n", sizeof(DataHead));
    	char *pbuffer = NULL;
    	DataHead *pDataHead = NULL;
    	char str[12] = "123456789";
    	DeviceInfo *pdeviceInfo = NULL;
    
    	pbuffer = (char *)malloc(1024);
    	memset(pbuffer,0,1024);
    	pDataHead = (DataHead *)pbuffer;
    	pdeviceInfo = (DeviceInfo *)(pDataHead->data);
    
    	memcpy(pdeviceInfo->devicename,  str, 12);
    
    	printf("pdeviceInfo->devicename = %s\n", pdeviceInfo->devicename);
    
    	//传输数[据](http://blog.itpub.net/29753604/viewspace-1281907/)总长度计算
    	printf("all data len = %lu \n", sizeof(DataHead)+sizeof(DeviceInfo));
     
        free(pbuffer);
        return 0;
    }
    

    参考资料

    http://blog.itpub.net/29753604/viewspace-1281907/
    https://blog.csdn.net/move_now/article/details/71929225
    https://blog.csdn.net/peng864534630/article/details/77620717

    展开全文
  • //结构体赋值 } } //void output(int n,int x) void output(Person *a, int n,int x) { int i; for (i=0;i { if (a[i].age>=x) { printf("%s",a[i].name); //if (a[i].sex='m') if(a[i].sex == 'm') printf("%-4s",...

    C/C++ code#include

    #include

    typedef struct Person

    {

    char name[8];

    char sex;

    int age;

    float money;

    } Person;

    //struct Person *a;//全局变量,动态分配数组长度

    //Person *a=(Person *) malloc (sizeof(Person)*(n+1));

    //void input(int n)

    void input(Person *a, int n)

    {

    int i;

    //struct Person x;//局部变量

    for (i=0;i

    {

    scanf("%s %c %d %f", a[i].name,&a[i].sex,&a[i].age,&a[i].money);

    //scanf("%s %c %d %f",x.name,&x.sex,&x.age,&x.money);//一条记录

    //a[i]=x;//结构体赋值

    }

    }

    //void output(int n,int x)

    void output(Person *a, int n,int x)

    {

    int i;

    for (i=0;i

    {

    if (a[i].age>=x)

    {

    printf("%s",a[i].name);

    //if (a[i].sex='m')

    if(a[i].sex == 'm')

    printf("%-4s","男");

    //else if (a[i].sex='w')

    else if (a[i].sex == 'w')

    printf("%-4s","女");

    else

    printf("性别出错!");

    //printf("-4%d",a[i].age);

    printf("%-4d",a[i].age);

    //printf("-4%d",a[i].money);

    printf("%.3f",a[i].money);

    printf("\n");

    }

    }

    }

    void main()

    {

    int n,x;

    scanf("%d %d",&n,&x);

    Person *a=(Person *) malloc (sizeof(Person)*(n+1));

    input(a, n);

    output(a, n,x);

    free(a);

    a = NULL;

    }

    展开全文
  • 什么叫变长结构体? typedef struct { int a; char b[0]; }Student; 那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的...

    什么叫变长结构体?

    typedef struct 
    {
    
        int a;
        char b[0];
    
    }Student;
    

    那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让buffer去指向那些额外的空间,这样就可以实现可变长的结构体了。

    下面我们来探讨动态开辟一个比结构体大的空间的问题,一般的实现思路都是开辟一个比结构体大的空间,如下:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct 
    {
    
        int a;
        char b[0];
    
    }Student;
    
    
    int main()
    {
    
        Student *tStudent = (Student *)malloc(sizeof(Student)+10)char c[10]="123456789";
        memcpy(tStudent->b,c,10);
        printf("1.sizeof %ld\n",sizeof(Student));
    
    
    	printf("2.sizeof %s\n",tStudent->b);
    
        
        printf("3.sizeof %ld\n",sizeof(tStudent));
    
    	
        return 0;
    
    }
    

    运行结果:
    1.sizeof 4
    2.sizeof 123456789
    3.sizeof 8

    那如果开辟的空间和结构一样大行不行呢,如下:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct 
    {
    
        int a;
        char b[0];
    
    }Student;
    
    
    int main()
    {
    
        //Student *tStudent = (Student *)malloc(sizeof(Student)+10);
        Student *tStudent=(Student *)malloc(sizeof(Student));
    
        char c[10]="123456789";
        memcpy(tStudent->b,c,10);
        printf("1.sizeof %ld\n",sizeof(Student));
    
    
    	printf("2.sizeof %s\n",tStudent->b);
    
        
        printf("3.sizeof %ld\n",sizeof(tStudent));
    
    	
        return 0;
    
    }
    

    运行结果:
    1.sizeof 4
    2.sizeof 123456789
    3.sizeof 8

    可以看到结构体无论是开辟比结构体大的空间还是一样的空间,其结果结果都是一样的。

    展开全文
  • C++变长结构体

    千次阅读 2018-07-04 21:22:37
    变长结构体,其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据如下两个结构体:using node = struct node { int a; int b; }using nodes = struct ...

    变长结构体,其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据

    如下两个结构体:

    using node = struct node
    {
        int a;
        int b;
    }
    using nodes = struct nodes
    {
        int nodeNums;
        node *array[2];
    }

    现在创建5个node结构体变量

    std::vector<node> allNode;
    
    for(int i=0;i<5;++i)
        allNode.append(new node);
    

    首先计算nodes结构体加上这5个结构体指针的长度

    decltype{allNode.size()} length=sizeof(nodes)+sizeof(node *)*allNode.size();

    创建此长度的缓冲区

    std::vector<char> buffer;
    buffer.resize(length);

    将此字符数组强制转换为nodes结构体

    nodes *n=reinterpret_cast<node *>(buffer.data());

    此时就可以为结构体的变量赋值了

    n->nodeNums=5;
    for(int i=0;i<n->nodeNums;++i)
        n->array[i]=reinterpret_cast<node *>(&allNode[i]);



    展开全文
  • C++可变长结构体

    2021-08-16 11:47:01
    变长结构体的核心思想就是在结构体的最后一个数据结构为一个指针,这个指针指向的是这个结构体的末尾数据数组的首地址。 #include <stdlib.h> typedef struct stru_zmq_server_msg { int deviceId; int ...
  • C++之变长数组与变长结构体

    千次阅读 2018-03-18 19:54:52
    在C99标准中,新加入了变长数组和变长结构体变长数组如下:其中a[n]就是变长数组,b[10]就是定长数组int main() { int b[10]; int n = 10; int a[n]; }该变长数组也可以对应于malloc的动态空间分配,等价于int *...
  • 深入浅出变长结构体

    2018-11-08 00:06:14
    深入浅出变长结构体
  • C++ 变长结构体的应用

    2021-03-22 14:49:47
    变长结构体的概念 使用变长结构体的格式如下: struct Test { .... int a; .... char b[0]; }; 重点是结构体的最后一个成员char b[0],是个空数组。在我们不知道结构体内的某个成员大小是多少的时候,我们在最后...
  • 解析变长结构体的用法和优点

    千次阅读 2017-05-14 10:08:06
    变长结构体:在接触变长结构体之前,以为会是一个很难理解的东西,但是这其实算是C里面的一种技巧吧,优点是:分配了一段连续的内存,防止内存碎片化以及方便内存的管理。使用变长结构体的格式如下:struct Test { .......
  • 【C语言】变长结构体

    2021-01-19 09:19:00
    什么叫变长结构体? 其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据。 struct Var_Len_Struct { int nsize; char buffer[0]; }; 那结构体是怎么...
  • C语言/ 变长结构体

    2018-01-29 14:54:00
    深入浅出变长结构体 引自:http://blog.csdn.net/pi9nc/article/details/11924295 深入浅出变长结构体 1、 问题的引出 项目中用到数据包的处理,但包的大小是不固定的,其长度由包头的2字节决定。比如...
  • 1.什么是变长数组struct MyData{int nLen;char data[0];};sizeof(MyData)=4;可能有的编译器不支持char data[0];需要用char data[1];代替,这样上面结构体大小是sizeof(MyData)=8(字节对齐);在上结构中,data是一个...
  • 看了大神的解答后才发现这个变长结构体,于是百度变长结构体,理解了什么事变长结构体。C99允许结构体最后使用0或1的长度数组的原因主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在...
  • 参考:C语言柔性数组 ...如上结构体中最后一个元素允许是未知大小的数组,这个数组就是柔性数组,这样有柔性数组成员(flexible array member)的结构体也被称为可变长结构体或者动态结构体。 在这个定义中要注...
  • C语言实现动态可变长结构体 可使用此方法进行变长数据缓存,在FIFO,FILO等数据结构中可以用到 #define MEM_BUFF_SIZE(x) (sizeof(Mem_t) + x*sizeof(char)) typedef struct tagMem{ int val; char buff[0]; }...
  • 变长结构体

    2012-12-16 20:24:00
    变长结构体的核心思想就是在结构体的最后一个数据结构为一个指针,这个指针指向的是这个结构体的末尾数据,说的有点绕,见下面结构体 typedef struct stru_tcp_server_msg { uint32_ msgLength; //消息体长度 ...
  • c语言变长结构体

    千次阅读 2017-08-27 15:48:34
    1.什么是变长数组 struct MyData { int nLen; char data[0]; }; sizeof(MyData)=4; 可能有的编译器不支持char data[0];需要用char data[1];代替,这样上面结构体大小是sizeof(MyData)=8(字节对齐); 在上...
  • 变长结构体的使用

    千次阅读 2014-07-16 15:02:37
    在分析安卓源码过程中看到几处使用变长结构体的例子,比如下面的结构体: struct command { /* list of commands in an action */ struct listnode clist; int (*func)(int nargs, char **args); int nargs; ...
  • c语言系统网络中发送变长结构体数据包 最近在做关于c语言系统网络,记录下关于发送变长结构体数据包 发送一个自定义的结构体,将结构体的的数据部分声明成如下形式: struct Data { int data_len; int type; char...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,558
精华内容 21,823
关键字:

变长结构体