将字符串赋值给常量结构体。

3

我有以下结构体:

struct example_struct { 
     int number ;
     char word[100] 
}

我在代码中将其初始化为一个常量结构体。

const struct example_struct example {
    .number = 5
} ;
strcpy(example.word, "some_string") ;

当我尝试编译我的代码时,它会给我一个警告:

"警告:传递给strcpy的第1个参数从指针目标类型中丢弃了const限定符"

我意识到当我将结构体声明为const时,不应该尝试为其赋值,但我也不能在结构体内部使用stringcpy。有没有办法在C语言中为const结构体的元素分配字符串?


如果您正在使用非文字字符串,可以创建一个非const实例并将其用作const的初始化程序。只需记住在此之前初始化/分配整个数组即可。 - Ilja Everilä
@IljaEverilä,您是在说我可以创建一个字符串或结构体的非const实例吗? - physics_researcher
在结构体中,复制字符串,并使用非const结构体作为const结构体的初始化器。但如果您从字符串字面量进行初始化,则这是相当无意义的,就像您已接受的答案所示。 - Ilja Everilä
1个回答

6
警告是正确的 - 因为您使用const修饰符声明了您的struct,在运行时将数据复制到其中会导致未定义的行为。
您可以删除修饰符,或者像这样初始化您的struct:
const struct example_struct example = {
    .number = 5
,   .word = "some_string"
};

这将把来自"some_string"的以空字符结尾的字符序列放入word[100]数组的初始部分,并用'\0'字符填充其余部分。


1
你是怎么想到使用指定初始化器来处理字符串字面量的呢?(我猜我知道你是怎么想到的,但我还是想听听你的解释。) - user2736738
@coderredoc 我之前尝试过这个 :-) 一般来说,C编译器在很多地方都允许“混合使用”,因此如果你可以使用标量变量初始化程序执行某些操作,那么你也应该能够使用指定的初始化程序执行相同的操作。 - Sergey Kalinichenko
1
聚合初始化的规则不是递归的吗(6.7.9p20)? - Ilja Everilä

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接