2015-04-18 79 views
3

在C中,我知道你可以將字符串賦值給char指針,所以擴展爲什麼會失敗?所以,我有一個字符雙指針,並說最初我希望它有一定的價值。然後我完成了使用這些,我想重新分配它。指定字符串數組char **

char **notes = { 
    "C4", "C5", "A3", "A4", "A3#", "A4#", "REST", 
    "C4", "C5", "A3", "A4", "A3#", "A4#", "REST", 
    "F3", "F4", "D3", "D4", "D3#", "D4#", "REST", 
    "F3", "F4", "D3", "D4", "D3#", "D4#", "REST", 
    "D4#", "D4", "C4#", "C4", "D4#", "D4", "G3#", 
    "G3", "C4#", "C4", "F4#", "F4", "E4", "A4#", 
    "A4", "G4#", "D4#", "B3", "A3#", "A3", "G3#" 
}; 

// do something with notes, then 

notes = { 
    "C3", "C4", "A2", "A3", "A2#", "A3#", "REST", 
    "C3", "C4", "A2", "A3", "A2#", "A3#", "REST", 
    "F2", "F3", "D2", "D3", "D2#", "D3#", "REST", 
    "F2", "F3", "D2", "D3", "D2#", "D3#", "REST", 
    "D3#", "D3", "C3#", "C3", "D3#", "D3", "G2#", 
    "G2", "C3#", "C3", "F3#", "F3", "E3", "A3#", 
    "A3", "G3#", "D3#", "B2", "A2#", "A2", "G2#" 
}; 

我得到的錯誤:

error: expected expression 
notes = { 
     ^

(獎勵積分的人誰可以識別歌曲提示:切換銳器等效單位)

+3

它是[馬里奧地下主題](https://www.youtube.com/watch?v=rdnTvgK2o5I)。即使我沒有得到正確的答案,我是否可以獲得積分? – dddsnn

回答

4

你應該初始化它在哪裏宣佈,而不是作爲一個單獨的步驟。

char** notes = { 
    "C3", "C4", "A2", "A3", "A2#", "A3#", "REST", 
    "C3", "C4", "A2", "A3", "A2#", "A3#", "REST", 
    "F2", "F3", "D2", "D3", "D2#", "D3#", "REST", 
    "F2", "F3", "D2", "D3", "D2#", "D3#", "REST", 
    "D3#", "D3", "C3#", "C3", "D3#", "D3", "G2#", 
    "G2", "C3#", "C3", "F3#", "F3", "E3", "A3#", 
    "A3", "G3#", "D3#", "B2", "A2#", "A2", "G2#" 
}; 

上述原因未定義的行爲,如果你嘗試修改它以後。如果你想要一個可變數組,一個選項是使用2維數組表示法(char notes[][4] = ...),但這會導致這種格式的空間浪費,因爲每個元素需要存儲4個字符,因爲最長的字符數組是4在長度上,3個非空值和一個空值。

更新: 如果你使用的C99,有compound literals,讓你做出右手側的表達,從而重新分配給它以下列方式。

char** notes; 
notes = (char*[]) { 
    "D3", "C4", "A2", "A3", "A2#", "A3#", "REST", 
    "C3", "C4", "A2", "A3", "A2#", "A3#", "REST", 
    "F2", "F3", "D2", "D3", "D2#", "D3#", "REST", 
    "F2", "F3", "D2", "D3", "D2#", "D3#", "REST", 
    "D3#", "D3", "C3#", "C3", "D3#", "D3", "G2#", 
    "G2", "C3#", "C3", "F3#", "F3", "E3", "A3#", 
    "A3", "G3#", "D3#", "B2", "A2#", "A2", "G2#" 
}; 

實施例:https://ideone.com/eD1xFu

+1

如果我想稍後重新分配值,該怎麼辦?這仍然不能解釋*爲什麼* C在聲明後不允許賦值。我知道這是一個解決方案,但只有當我不重新分配數組時。 –

+0

@PatrickRoberts沒有簡單的方法來做到這一點。當你這樣做時,它可能在ROData部分,不可修改(導致UB)。如果你確實想要修改它,你應該將這個存儲放在malloc中(或者使用數組表示法)。以上僅適用於您的程序持續時間不變的少量數據。 –

+0

@PatrickRoberts如果您使用C99,請參閱更新,並且只是想爲其重新分配另一組常量值。 –