gpt4 book ai didi

c - 在结构中初始化一个 const 数组

转载 作者:太空狗 更新时间:2023-10-29 17:04:02 24 4
gpt4 key购买 nike

#define LENGTH 6
typedef char data_t[LENGTH];
struct foo {
const data_t data;
...
}
...
void bar(data_t data) {
printf("%.6s\n", data);
struct foo myfoo = {*data};
printf("%.6s\n", foo.data);
}

我正在尝试让这个结构直接保存我感兴趣的数据,sizeof(foo) == 6+the rest,而不是 sizeof(foo) == sizeof(void*)+其余的。但是,我找不到用 data_t 初始化类型为 foo 的结构的方法。我想也许我可以从字段中删除 const 修饰符并使用 memcpy 但我喜欢额外的安全性和清晰度。

我没有得到任何编译错误,但是当我运行代码时我得到了

123456
1??

所以我认为副本无法正常工作。

这是针对 arduino(或类似设备)的,因此我试图将其保留为非常便携的代码。

这是不可能的吗?

编辑:删除 data_t 字段上的 const 修饰符似乎没有帮助。

最佳答案

可以做到这一点,但要付出一定的代价 >=0

typedef struct
{
char c[LENGTH];
} data_t; // this struct is freely copyable

struct foo
{
const data_t data; // but this data member is not
int what;
};

void foo (char* x) {
data_t d; // declare freely copyable struct instance
memcpy(d.c, x, sizeof(d.c)); // memcpy it
struct foo foo = { d, 42 }; // initialise struct instance with const member
...
};

一些编译器(例如 clang)甚至能够优化冗余复制(从 xd.c 然后从 dfoo.data ⇒ 从 x 直接到 foo.data)。其他人(gcc 我在看着你)似乎无法实现这一点。

如果您传递指向 data_t 的指针而不是直接的 char 指针,您将不需要这个额外的 memcpy 步骤。 OTOH 为了访问 foo 中的 char 数组,您需要另一个级别的成员访问权限(.data.c 而不仅仅是 。数据;虽然这没有运行时成本)。

关于c - 在结构中初始化一个 const 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44352117/

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