2013-02-15 69 views
1

這是一個好習慣嗎?該代碼可以編譯和運行,但我不知道這是否是效仿 在C代碼的好做法,改變一個常量字符* str1 =「abc」

  1. 我們寫const char *str1 = "abc";
  2. 再後來,可以說有一個指針變量char *str2指向動態分配的內存
  3. ,然後我們就str1 = str2所以現在都str1str2指向動態分配的內存

所以,現在我們已經失去了軌道任何指向​​的指針。雖然在這個代碼中,我們可能不需要它,但我不知道什麼是處理這些問題的最佳推薦方式。

總的問題是我們需要一個最初被聲明爲abc的字符串,後來依賴於用戶輸入,我們可能希望使用用戶提供的字符串。

+0

我不是穿着頸須的開發者,但爲什麼有人會改變任何表示爲永恆的東西? – 2013-02-15 10:15:41

+1

@GrantThomas但他沒有改變任何標記爲const的東西。聲明中的'const'限定符引用str1指向的內容,而不是str1本身。 – Clyde 2013-02-15 10:17:30

+0

@克萊德嗯,是的,但是我的陳述仍然存在,無論你是在談論事情還是事情的事情。看起來,開發人員會希望它不變。 – 2013-02-15 10:19:45

回答

3

這絕對沒問題。 const char *str1的意思是「一個可修改的指針,指向無法修改的字符數據(通過該指針)」。

因此,您可以指定str1作爲您喜歡的任何字符串,並且「重新設置」它指向不同時間的不同字符串是有意義的。

很明顯,如果你的代碼很複雜,你可以讓讀者很難找出變量當前包含的內容,但所有變量都是如此。例如,你要小心有時指向字符串文字的指針,有時指向動態分配的內存,因爲指針應該是free ed可能並不總是清楚。

如果你想str1總是在相同的串點,你把它定義const char * const str1(或char const *const str1爲了使const總是一致的位置)。在這種情況下,這不是你想要的,而且你還沒有聲明str1 const這一事實,這對讀者來說意義重大。

1

失去指向字符串文字的指針不會導致內存泄漏,所以你在這方面做的是安全的。

1

字符串文字​​不是動態分配的,所以在這種情況下沒有任何東西可以泄漏。

字符串文字是「程序映像」的一部分,它在啓動時被操作系統的可執行加載程序加載到內存中。一旦該過程結束,該映像佔用的空間由操作系統回收。當然,這不是很準確,因爲有技術需求分頁和寫入時複製,但它們與這種情況無關。

如果您沒有在該定義中輸入const,將會出現問題。後者將允許您嘗試修改通常存儲在進程的只讀區域中的一段內存,因此會顯示未定義的行爲。

相關問題