下面是一个示例,我尝试在结构中为const指针指定一个const指针,编译器不会让我这么做。但我可以毫无问题地分配文字。如果你知道我的意思,我还试过这个案例,不管有什么常数,但我仍然不知道为什么编译器对文字很酷但是作为分配中的char *的问题。
const char* cat_surname = "Snack";
typedef struct
{
const char* first;
const char* last;
}PET_T;
PET_T dog =
{
"Rover", // OK
"Cateater" // OK
};
PET_T cat =
{
"Tasty", // OK
cat_surname // ERROR :-(
};
我收到此编译器错误:
错误:初始化元素不是常量
使用Arch Linux gcc版本4.8.2 20140206(预发行版)(GCC)
答案 0 :(得分:2)
要避免此问题,请将cat_surname
数组设为const char
,而不是指向const char
的指针。
const char cat_surname[] = "Snack";
PET_T cat = {
"Tasty",
cat_surname
};
注意:使用const
并不意味着对象是常量。它有点像“只读”。在i
调用foo()
时,foo
可能会有不同的值,但函数void foo(const int i) {
i = 5; // compile time error
}
可能不会更改它。
const
在const char* cat_surname = "Snack";
中使用cat_surname
并不意味着const
无法改变价值。 cat_surname
此处表示不应尝试更改数据*cat_surname = 'X'; // bad
指向的更改,如下所示:
cat.last
编译器错误“初始化元素不是常量”需要一个真正的常量。一个数组是:数组的第一个元素总是在同一个地址。
@Matt McNabb提出了一个很好的观点,即cat_surname
的初始值可能为{{1}}。我没有充分理由说C不允许这样做。