【问题标题】:Why can I not assign a const pointer to a const pointer in a struct?为什么我不能将 const 指针分配给结构中的 const 指针?
【发布时间】:2014-05-30 04:24:32
【问题描述】:

下面是一个示例,我尝试将 const 指针分配给结构中的 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 (prerelease) (GCC)

【问题讨论】:

  • const-qualified 对象不是编译时常量。
  • 建议const char cat_surname[] = "Snack"; PET_T cat = { "Tasty", cat_surname };
  • 您可能应该将其发布为答案@chux ...理由是文件范围对象的地址算作常量;所以这里的cat_surname 衰减为链接器能够填写的&cat_surname[0]。
  • @chux 谢谢,这行得通!在旁注中,我不小心单击了两次向上箭头(upvote/downvote),现在它不会让我永远支持它。很抱歉,但感谢您的帮助。

标签: c pointers gcc constants


【解决方案1】:

为避免此问题,请将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 char* cat_surname = "Snack"; 中使用const 并不意味着cat_surname 不能更改值。 const 这里的意思是 cat_surname 指向的数据不应该被尝试改变如下:

*cat_surname = 'X'; // bad

编译器错误“初始化元素不是常量”需要一个真正的常量。数组就是:数组的第一个元素总是在同一个地址。

@Matt McNabb 提出了一个很好的观点,即cat.last 的初始值可以为cat_surname。我没有充分的理由说明 C 不允许这样做。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2021-03-23
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多