这怎么会编译

时间:2015-07-22 00:00:59

标签: c arrays pointers memset

我回过头来回顾一段时间以来我写过的旧代码,并看到了类似的内容:

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;

1 个答案:

答案 0 :(得分:1)

第一个版本(LocRunTimeInfo[LabelId])缺少地址运算符:&LocRunTimeInfo[LabelId]是正确的。如果没有它,它将返回struct mpls_RuntimeInfo_s,而不是指向它的必需指针。

LocRunTimeInfo + LabelId也是正确的,因为它是identical到正确的版本。标准中的文字显示了获取条目本身,但&*(ptr + index)(ptr + index)相同。

请注意,LocRunTimeInfo应指向足够大小的数组;初始化后的空指针导致未定义的行为