2011-10-11 73 views
1

如果輸入常量字符串以某種方式被修改(導致C編譯器警告),處理它的最好方法是什麼 - 將其轉換爲新變量,然後使用它或複製它並使用它,然後釋放它。或者還有其他方式來處理這種情況。請建議。任何幫助,將不勝感激。類型轉換字符串和strdup

//鑄字

const char * s1; 
char * s2 = (char *)s1; 

//複製和自由

const char * s1; 
char * s2 = strdup(s1); 
free(s2) 

編輯:這是一個C編譯器;不是C++。我不確定是否在類型轉換中,s2將是字符串s1的新副本,還是將指向原始字符串s1?

感謝您的答案。我還有一個疑問 -

const char * c1; 
const char * c2 = c1; 

上述分配是否有效?

+0

這取決於你需要修改一個const字符串的原因的細節。 –

回答

5

在這裏拋出const可能會關閉編譯器,但會導致運行時失敗。製作一個字符串的副本並對其進行處理。

鑄造掉const不會複製內存的內容。它只是創建一個指向同一內存的指針,並告訴編譯器它可以直接前進並寫入該內存。如果內存是隻讀的,你有一個保護錯誤。更嚴重的是,您可能會遇到難以調試的正確性問題。不要拋棄const。

當然,如果你需要修改一個變量,並讓這些修改對調用者可見,那麼你不應該首先將它設置爲const。另一方面,如果修改意味着對函數是私有的,那麼const參數的重複是最好的。

作爲一個廣泛的規則,你應該儘可能地避免劇組。演員陣容是最常見的錯誤來源之一。

+0

沒有太多要添加。例如,字符串文字駐留在只讀存儲器中,當您嘗試寫入該內存時,拋出const將導致保護錯誤。不要拋棄const。 –

0

如果您的輸入是const char*,那麼您絕對應該聽取編譯器警告並保持獨立。

2

如果數組s1點是const那麼你不得修改;這樣做會導致不確定的行爲。在這種情況下,如果你需要修改它,那麼你將不得不復制一份。更新:類型轉換會給你一個指向同一個數組的指針,它仍然是const,所以你仍然在一定不能修改(即使試圖這樣做不會再給出編譯錯誤)。

如果您可以保證數組不是const,那麼您可以通過丟棄指針中的const來修改它。在這種情況下,如果您可以通過不首先將const限定符添加到s1來強制執行該保證,那麼它將不太容易出錯。

+0

s1在我的情況下絕對是const。那麼你是說strdup比類型轉換更好嗎? – user32262

+1

這正是我們都告訴你的! –

+0

@ user32262:是的,類型轉換指針會給你一個指向同一個數組的指針,你仍然不能修改它。我已經更新了我的答案以澄清。 –