变长结构体的表示方法

转载请注明出处: http://blog.csdn.net/zhangyang0402/archive/2010/08/07/5795614.aspx

 

在Linux程序中,经常会看到形如下面的结构体定义
struct xfrm_algo {
 char  alg_name[64];
 unsigned int alg_key_len;    /* in bits */
 char  alg_key[0];
};

这里,最奇怪的是结构体最后一个元素, 是一个零长度的字符数组

这里先解释一下结构体的作用。
xfrm_algo是一个定义密钥算法的结构体,alg_name存放算法名称,alg_key_len存放密钥长度(单位是bit),all_key存放密钥. 因为同一个算法,有可能会使用不同长度的密钥。

如AES, 就有128位、192位和256位三种密钥。 所以,在定义这样一个密钥算法的结构体时,就要求不定长的结构体,而零长数组就可实现这一点。


当然,我们也可以使用指针来代替

struct xfrm_algo {
 char  alg_name[64];
 unsigned int alg_key_len;    /* in bits */
 char *  alg_key;
};

下面,分别用指针和零长数组实现不定长结构体。

方法1:定义一个xfrm_algo结构体变量,再为alg_key成员动态创建内存

这种情况下,实际的xfrm_algo结构体和密钥是分离的

 

执行结果:
$ ./struct_pointer1
sizeof(struct xfrm_algo) = 72
algo1: 0xbff54108
        alg_name   : 0xbff54108(AES)
        alg_key_len: 0xbff54148(128)
        alg_key    : 0x09b2f008(0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f )

从输出可观察到, alg_key_len与alg_key是分离的

 

方法2: 直接为xfrm_algo和已知的密钥动态创建内存

此时,xfrm_algo结构体和密钥是连续的。

 

执行结果:
$ ./struct_pointer2
sizeof(struct xfrm_algo) = 72
palgo: 0x096bd008
        alg_name   : 0x096bd008(AES)
        alg_key_len: 0x096bd048(128)
        alg_key    : 0x096bd050(0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f )

从输出可观察到, alg_key_len与alg_key是连续的。这里,alg_key似乎是多余的,因为我们总能使用(unsigned char *)( palgo + 1 )得到key的首地址。
 
方法3:零长度数组

在标准C语言中,是不允许零长度数组的。但 GNU C 允许。

 

 


执行结果:

$ ./struct_array
sizeof(struct xfrm_algo) = 68
palgo: 0x0980d008
        alg_name   : 0x0980d008(AES)
        alg_key_len: 0x0980d048(128)
        alg_key    : 0x0980d04c(0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f )

xfrm_algo结构体大小为68个字节, alg_key[0]不占存储空间,和方法1、2相比,少了个unsigned char *指针,但可移植性不比前两种方法。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值