这甚至如何编译
how does this even compile
我刚刚回顾了一段时间以前写的旧代码,看到了这样的东西:
memset(LocRunTimeInfo[LabelId],0x00,sizeof(mpls_RuntimeInfo_t));
不应该是:
memset(LocRunTimeInfo + LabelId,0x00,sizeof(mpls_RuntimeInfo_t));
LocRunTimeInfo 的声明如下:
static mpls_RuntimeInfo_t *LocRunTimeInfo = NULL;
我在下面详细说明了mpls_RuntimeInfo_s
的声明:
typedef struct mpls_RuntimeInfo_s {
UINT16 u16LabelId;
jpax_egrobstr_t *pEgrObj;
bcm_l3_intf_t l3_intf;
bcm_mpls_vpn_config_t vpn_info;
bcm_gport_t provider_gport;
bcm_gport_t mpls_p_port_id;
UINT8 smac[6];
UINT16 u16ProviderVid;
} mpls_RuntimeInfo_t;
第一个版本 (LocRunTimeInfo[LabelId]
) 缺少地址运算符:&LocRunTimeInfo[LabelId]
是正确的。没有它,它 returns struct mpls_RuntimeInfo_s
,不是指向它的必需指针。
LocRunTimeInfo + LabelId
也是正确的,因为 identical 是正确的版本。标准中的文本显示获取条目本身,但 &*(ptr + index)
与 (ptr + index)
.
相同
注意LocRunTimeInfo
应该指向一个足够大的数组; 空指针 它在初始化后导致未定义的行为。
我刚刚回顾了一段时间以前写的旧代码,看到了这样的东西:
memset(LocRunTimeInfo[LabelId],0x00,sizeof(mpls_RuntimeInfo_t));
不应该是:
memset(LocRunTimeInfo + LabelId,0x00,sizeof(mpls_RuntimeInfo_t));
LocRunTimeInfo 的声明如下:
static mpls_RuntimeInfo_t *LocRunTimeInfo = NULL;
我在下面详细说明了mpls_RuntimeInfo_s
的声明:
typedef struct mpls_RuntimeInfo_s {
UINT16 u16LabelId;
jpax_egrobstr_t *pEgrObj;
bcm_l3_intf_t l3_intf;
bcm_mpls_vpn_config_t vpn_info;
bcm_gport_t provider_gport;
bcm_gport_t mpls_p_port_id;
UINT8 smac[6];
UINT16 u16ProviderVid;
} mpls_RuntimeInfo_t;
第一个版本 (LocRunTimeInfo[LabelId]
) 缺少地址运算符:&LocRunTimeInfo[LabelId]
是正确的。没有它,它 returns struct mpls_RuntimeInfo_s
,不是指向它的必需指针。
LocRunTimeInfo + LabelId
也是正确的,因为 identical 是正确的版本。标准中的文本显示获取条目本身,但 &*(ptr + index)
与 (ptr + index)
.
注意LocRunTimeInfo
应该指向一个足够大的数组; 空指针 它在初始化后导致未定义的行为。