为什么我不能将const指针分配给结构中的const指针?

时间:2014-04-15 17:04:01

标签: c pointers gcc const

下面是一个示例,我尝试在结构中为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)

1 个答案:

答案 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不允许这样做。