零长度数组

#include <stdlib.h>
#include <stdio.h>
struct device{
    int num;
    int count;
    int reserve[0];   //reserve是一个数组名;该数组没有元素;该数组的其实地址紧随结构device之后;这种声明方法可以巧妙的实现C语言里的数组扩展
};

int main()
{
    struct device * p_dev =
        (struct device *) malloc (sizeof(struct device) + sizeof(int)*25);
    //sizeof(int)*25
是数组reserve的具体空间(25个元素)
    p_dev->reserve[0] = 100;

    p_dev->reserve[24] = 0;
    printf("p_dev->reserve[24] = %d\n", p_dev->reserve[24]);
    printf("sizeof(struct device) = %d\n",sizeof(struct device));

// 将结构体device之后的第一个内容(int值,其实就是reserve[0]的值)赋值给变量a
// int a = *((&(p_dev->count)) + 1);
    int a = *(&p_dev->count + 1);
    printf("a = %d\n", a);
}

# ./a.out
p_dev->reserve[0] = 100
p_dev->reserve[24] = 0
sizeof(struct device) = 8
a = 100

-------------------------------------------

p_dev ---> |--------------|
           |int num       |
           |int count     |
           |--------------|      reserve是数组的名字;
   reserve |              |      由于数组没有元素,该数组在该结构体中分配占用空间
           |              |      所以sizeof(struct device) = 8
           |              |
           |              |
           |--------------|

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值