为什么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"}}
最佳答案
您尚未指定data
的struct scs_data_tag
成员的大小。这声明为C99 flexible array member。该成员的默认大小为0,并且您需要比实际结构大小更多malloc
才能包含数据。
根据该标准,struct scs_data_tag
不可能是数组的元素(因为它包含灵活的数组成员)。但这是某些编译器支持的扩展。
如果您改为给此数组足够大的大小(例如char data[40]
),则您的代码应该可以正常工作。