GNU C中的零长度/变长数组 、内存空间节省

604 篇文章 8 订阅
579 篇文章 5 订阅

在标准C和C++中,长度为0的数组是被禁止使用的。不过有些编译器(如GCC)的扩展功能支持 0 长度的数组,但是这个功能是不可移植的,所以,如果你致力于编写可移植,或者是稍稍需要跨平台的代码,需要注意。但它只能被用于结构体的最后一个成员。

    #include <stdio.h>  
    #include <stdlib.h>  
      
    struct line {  
        int length;  
        char contents[0];  
    };  
      
    int main(void)  
    {  
        int i, count = 9;  
        char letter = 'A';  
      
        struct line *thisline = (struct line *)malloc(sizeof(struct line) + count);  
          
        thisline->length = count;  
        for (i = 0; i < count; i++)  
        thisline->contents[i] = letter++;  
          
        printf("sizeof(struct line) = %d\n", sizeof(struct line));  
          
        for (i = 0; i < thisline->length; i++)  
        printf("%c ", thisline->contents[i]);  
        printf("\n");  
          
        return 0;  
    }  

    例子输出结果: 
[cpp] view plaincopy

    sizeof(struct line) = 4  
    A B C D E F G H I


    2、变长数组

    在支持变长数组之前,C语言数组的大小是在声明时确定的(下标是一个常量表达式)并一直保持不变。所谓变长数组就是指数组的大小可以在运行时指定。

注意,变长num一定要声明在变长数组arr之前。


----------------------------------------我是分割线--------------------------------------

一、__attribute__

    1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。


二、union(共用声明和共用一变量定义)“联合”是一种特殊的类,也是一种构造类型的数据结构。这些数据共享同一段内存,以达到节省空间的目的 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。


三、(还有一个节省空间的类型:位域)。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值