簡體   English   中英

使用宏時C結構初始化問題的數組

[英]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_tagdata成員的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM