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

标签 c struct initialization malloc constants

我试过了;

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/

相关文章:

c - 我如何制作一个函数来计算我的订单总数并将价格相加?

C 数组在结构末尾初始化

c++ - 使用了未初始化的局部变量 'r'

c++ - 有没有可能的方法来强制使用字符串文字进行隐式构造函数初始化

c - 将 C 函数的返回类型设为 const 有什么用?

c - 如何在代码 .h 文件中组织声明和函数并包含以实现最佳代码重用

c - 是否有 sscanf 的变体,它带有指向输入字符串而不是缓冲区的指针?

c - 将数组映射到结构时的顺序相反

C++结构题

python - 将信息传递给导入的 Python 模块