gpt4 book ai didi

c - 如何在 C 中的结构中初始化 const(使用 malloc)

转载 作者:太空狗 更新时间:2023-10-29 16:27:37 25 4
gpt4 key购买 nike

我试过了;

void *malloc(unsigned int);
struct deneme {
const int a = 15;
const int b = 16;
};

int main(int argc, const char *argv[])
{
struct deneme *mydeneme = malloc(sizeof(struct deneme));
return 0;
}

这是编译器的错误:

gereksiz.c:3:17: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token

还有这个;

void *malloc(unsigned int);
struct deneme {
const int a;
const int b;
};

int main(int argc, const char *argv[])
{
struct deneme *mydeneme = malloc(sizeof(struct deneme));
mydeneme->a = 15;
mydeneme->b = 20;
return 0;
}

这是编译器的错误:

gereksiz.c:10:5: error: assignment of read-only member 'a'
gereksiz.c:11:5: error: assignment of read-only member 'b'

而且都没有被编译。当使用 malloc 分配内存时,有什么方法可以在结构中初始化一个 const 变量?

最佳答案

您需要放弃 const 来初始化 malloc 结构的字段:

struct deneme *mydeneme = malloc(sizeof(struct deneme));
*(int *)&mydeneme->a = 15;
*(int *)&mydeneme->b = 20;

或者,您可以创建该结构的初始化版本并将其 memcpy:

struct deneme deneme_init = { 15, 20 };
struct deneme *mydeneme = malloc(sizeof(struct deneme));
memcpy(mydeneme, &deneme_init, sizeof(struct deneme));

如果你经常这样做,你可以使 deneme_init 静态和/或全局(这样它只需要构建一次)。


使用 C11 标准引用解释为什么这段代码不是某些评论所建议的未定义行为:

  • 此代码不违反 6.7.3/6,因为 malloc 返回的空间不是“定义 具有 const 限定类型的对象”。表达式 mydeneme->a 不是一个对象,它是一个表达式。尽管它具有 const 限定类型,但它表示未使用 const 限定类型定义的对象(实际上,根本未定义任何类型)。

  • 写入由 malloc 分配的空间永远不会违反严格的别名规则,因为每次写入都会更新有效类型 (6.5/6)。

(然而,从 malloc 分配的空间中读取可能会违反严格的别名规则)。

在 Chris 的代码示例中,第一个将整数值的有效类型设置为 int,第二个将有效类型设置为 const int,但是在继续通过 *mydeneme 读取这些值的两种情况都是正确的,因为严格别名规则(6.5/7 项目符号 2)允许通过与有效类型同等或更合格的表达式读取对象的对象。由于表达式 mydeneme->a 的类型为 const int,因此它可用于读取有效类型为 intconst int 的对象

关于c - 如何在 C 中的结构中初始化 const(使用 malloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9691404/

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