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