2014-04-15 50 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不允許這樣做。

相關問題