2014-04-15 46 views
1

下面是一个示例,我尝试在结构中为const指针分配一个const指针,编译器不会让我。但我可以指定一个没有任何问题的文字。如果你知道我的意思,我也试过这个例子,但是我仍然不明白为什么编译器对文字很酷,但是作为分配中char *的问题。为什么我不能将const指针分配给结构体中的const指针?

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 :-(
}; 

我得到这个编译器错误:

error: initializer element is not constant

使用Arch Linux的gcc版本4.8.2 20140206(抢鲜)(GCC)

+1

“const”限定的对象不是编译时常量。 – effeffe

+2

当尝试用const来初始化变量时,错误“初始化元素不是常量”的可能的重复(http://stackoverflow.com/questions/3025050/error-initializer-element-is-not-constant-when-trying- to-initialize-variable-w) – effeffe

+1

建议'const char cat_surname [] =“Snack”; PET_T cat = {“Tasty”,cat_surname};' – chux

回答

2

为了避免这个问题,使cat_surnameconst 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 

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

@马特麦克纳布带来了一个好点的cat.last初始值可以cat_surname。我没有强烈的理由,为什么C不允许这样做。

相关问题