討論區快速選單
知識庫快速選單
網路投保旅行平安險 軟體開發過程中有哪些資安漏洞? 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
C語言字面字串算不算常數?
更改我的閱讀文章字型大小
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/6/6 下午 01:47:30
最近維護一個舊的程式碼看到一個函式,大意上是傳入一個字串,然後將他顯示出來。
這個函式大致長這樣:

void func(char *msg);

這個函式的宣告會讓我不能直接傳入 const char* 型態的字串而需要轉型,這我可以理解。
但是我搜尋一下卻發現有很多呼叫這個函式的地方是這樣寫的:

func("message");

這是讓我感到困惑的點,字面常量印象中都是 const 的啊!
為什麼這時候不需要轉型,並且編譯器還真的沒有發出警告?
(GCC + -Wall)

我再測試了一下,發現下面這樣的寫法竟然是不會產生警告的:

char *str = "hello";

於是我好奇的嘗試對這個字串進行修改,但結果就是 segmentation fault。
至此,我已經確定的是字面字串真的是貯存在唯讀的空間,並且那樣的寫法用在 C++ 是真的會產生編譯警告。

整理一下我的問題,我的疑問是:

* 將字面字串賦值給非常數字元指標變數為什麼可以被編譯器接受?是只有 GCC 會這樣,還是這是 C 語言共通的現象?而如此設計的考量點又為的是什麼?
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ice_emissary註記此篇回應為最佳解答 2015/6/6 下午 10:49:53
這是因為歷史的原因.

最早的 K&R C 是沒有 const 這個關鍵字的, const volatile 關鍵字及概念是在制定 C89 標準時才加進去的. 但那時已經有太多原始碼用 char *s = "hello", 強制加入 const 會導致很多現有的程式碼無法編譯, 所以只能妥協.

string literal 的官方類型是 const char[], 但編譯器會悄悄的把它們轉為 char* (語言標準把這個轉換設為 depreciated conversion).

>void func(char *msg);

如果你確定 func() 真的不會修改 msg 所指向的內容, 那這應該是早期的寫法 (為了跟舊的編譯器或函式庫兼容), 或是沒有正確引用 const-correctness 的程式. 在這情況下, 你只能無奈的用 casting 來做轉換 (C++ 用 const_cast), 這也是少數能夠安全使用 const casting 的地方之一.

作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/6/7 下午 02:24:12
原來是因為早年的 C 語言沒有 const 修飾字的關係啊!
我了解了,謝謝你的回答。
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.140625