需求
有時候,我們會遇到一些情況:數據前部分相同,但是后部分長度不固定;數據格式相似,只是尾綴的長度不同,例如某些數據包,需要不定長度。
為了能夠同時使用上不同長度的數據。可以用以下的方式實現。
方案
結構體尾部加指針
需要 管理尾部指針
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;
}