[英]C array of structs initialization issues when using macros
為什么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"}}
您尚未指定struct scs_data_tag
的data
成員的struct scs_data_tag
。 這聲明了一個C99 靈活的數組成員 。 默認情況下,此成員的大小為0,並且您需要malloc
多於實際的struct大小才能使其包含數據。
根據標准, struct scs_data_tag
不可能是數組的元素(因為它包含一個靈活的數組成員)。 但是一些編譯器支持這作為擴展。
如果你改為給這個數組足夠大(例如char data[40]
),你的代碼應該可行。
加入interjay的答案, 你看到adsafe_tags[1].key_size = 11888
,它是十六進制的0x2e70
,表示ASCII字符p
(= 0x70
)和.
(= 0x2e
),因此"p."
。
同樣, adsafe_tags[1].val_size = 29537
,即0x7361
或"as"
,rest正確打印為字符串。
這表明沒有為adsafe_tags[0].data
分配空間。
您為初始化它提供的字符串已映射到下一個數據集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.