gpt4 book ai didi

使用宏时 C 结构数组初始化问题

转载 作者:行者123 更新时间:2023-12-02 00:00:45 26 4
gpt4 key购买 nike

为什么 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 成员的大小。这声明了一个 C99 flexible array member .默认情况下,此成员的大小为 0,您需要 malloc 大于实际结构大小,以便它能够包含数据。

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

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

关于使用宏时 C 结构数组初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com