为什么adsafe_tags [1]没有正确初始化?

// local string (via static)
#define SSTRL(varname, val) \
    static const char varname[] = val

#define SSTRLEN(var) \
    (sizeof(var) - 1)

struct scs_data_tag
{
    uint16_t key_size;
    uint16_t val_size;
    char     data[];
};

SSTRL(ADSAFE_KEY, "p.as.rsa");
SSTRL(ADSAFE_VAL_BAD, "0");
SSTRL(ADSAFE_VAL_GOOD, "1000");
#define ADSAFE_KV_BAD "p.as.rsa0"
#define ADSAFE_KV_GOOD "p.as.rsa1000"

struct scs_data_tag adsafe_tags[] = {
    {SSTRLEN(ADSAFE_KEY), SSTRLEN(ADSAFE_VAL_BAD), ADSAFE_KV_BAD},
    {SSTRLEN(ADSAFE_KEY), SSTRLEN(ADSAFE_VAL_GOOD), ADSAFE_KV_GOOD}
};

在gdb中,我得到以下信息:
(gdb) p adsafe_tags
$7 = {{key_size = 8, val_size = 1, data = 0x8ce664 <adsafe_tags+4> "p.as.rsa0"}, {key_size = 11888, val_size = 29537, data = 0x8ce668 ".rsa0"}}

最佳答案

您尚未指定datastruct scs_data_tag成员的大小。这声明为C99 flexible array member。该成员的默认大小为0,并且您需要比实际结构大小更多malloc才能包含数据。

根据该标准,struct scs_data_tag不可能是数组的元素(因为它包含灵活的数组成员)。但这是某些编译器支持的扩展。

如果您改为给此数组足够大的大小(例如char data[40]),则您的代码应该可以正常工作。

10-08 18:41