c大小为0的数组

大小为0的数组  

Q:数组大小为0应该怎么理解? 
比如: 
struct page *page[0]; 
unsigned long private[0] ____cacheline_aligned;

A:一个很好的例子就是 
struct unix_address 

atomic_t refcnt; 
int len; 
unsigned hash; 
struct sockaddr_un name[0]; 
}; 

#define UNIX_PATH_MAX 108 

struct sockaddr_un { 
sa_family_t sun_family; /* AF_UNIX */ 
char sun_path[UNIX_PATH_MAX]; /* pathname */ 
}; 

其中name实际上指向unix_address结构之后的空间。 
好处就是sockaddr_un是变长的,为了不浪费空间,就这样定义。到实际分配unix_address结构的时候按实际的地址大小一并分配空间,那样就可以通过unix_address->name来访问实际的地址。

这样做的具体的优点:
struct unix_address 

atomic_t refcnt; 
int len; 
unsigned hash; 
void *name; 
}; 

1。name占用空间(4字节) 
2。分配空间的时候可以一起分配,但是需要把p->name设置为=p++,访问name的值时需要指针中
转一下 

而 
struct unix_address 

atomic_t refcnt; 
int len; 
unsigned hash; 
struct sockaddr_un name[0]; 
}; 
没有上面两个缺点 
1。它不占用结构的空间 
2。如果访问某个p->name,却可以访问紧接p的内存空间 
利用上面两个特性,就可以根据实际的unix域地址大小来一起分配空间,通过p->name访问地址

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

|                 |实际地址|          

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

^                  ^

|                   |

p                  name 

它可以用来定义一个变长的结构体,比如你可以动态分配这个结构体,并把分配的长度等于sizeof(struct) + len,这样len这么长的内存就可以直接用最后的那个没有实际空间的指针来引用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值