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\n", sizeof(a));
    return 0;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM