zoukankan      html  css  js  c++  java
  • C语言:不定长结构体的实现方式

    需求

    有时候,我们会遇到一些情况:数据前部分相同,但是后部分长度不固定;数据格式相似,只是尾缀的长度不同,例如某些数据包,需要不定长度。

    为了能够同时使用上不同长度的数据。可以用以下的方式实现。

    方案

    结构体尾部加指针

    需要 管理尾部指针

    struct s {
    	int len;
    	int *data;
    };
    
    struct s *p = malloc(sizeof(struct s)); 
    p->data = malloc(...);
    
    free(data);
    free(p); // 完成内存回收,需要先free(data);
    

    零长数组

    GNU C 才有这种写法
    如果编译器不支持,那么可以将data[0]改成data[1]

    struct s {
    	/* 固定的数据内容 */
    	int len;
    	int data[0];
    };
    
    struct s *p = malloc(sizeof(struct s) + xx); // xx 代表额外的长度
    
    free(p); // 完成内存回收,而不需要再free(data);
    

    宏定义实现

    
    #define ST_WITH_LEN(size) 
        struct _register_st##size 
        { 
            char data[size]; 
        }
    
    int main(int argc, char *argv[])
    {
        int len = 5;	
        ST_WITH_LEN(len) a;
        printf("%d
    ", sizeof(a));
        return 0;
    }
    
    
  • 相关阅读:
    去掉滚动条
    一些input用法
    jquery-ui datepicker
    js修改样式
    js时间
    跳转到页面的某个anchor
    事件传递
    flex对象.show()的时候display变成block
    html中传递信息
    button disable and enable
  • 原文地址:https://www.cnblogs.com/schips/p/13598030.html
Copyright © 2011-2022 走看看