作者kdok123 (小天)
看板C_and_CPP
標題[問題] 字串賦值問題
時間Sun Oct 19 23:33:09 2014
ex1:
char str[6] = "hello";
*str = 'x';
// 編譯通過
ex2:
char *str = "hello";
*str = 'x';
//編譯失敗
想請問是為什麼呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.25.105
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1413732792.A.055.html
推 LPH66: 置底十三誡之四 10/19 23:41
推 jammy50605: ex1的str是陣列第一個元素的位址 會變成xello 10/20 00:06
→ jammy50605: ex2的str是字元指標 字元指標重新指定字串要 str='x' 10/20 00:07
→ jammy50605: 字串會整個被改成x 而且應該要用雙引號代表字串"x" 10/20 00:11
→ loveflames: 第二個指向唯讀區,就算能編譯也不能執行 10/20 00:31
→ uranusjr: 不過原來這樣會 error 啊, 我一直以為會通過然後 crash 10/20 00:53
推 johnpage: 死背 10/20 00:58
推 LPH66: 連這都要死背的話還是別寫程式吧 (望) 另外四樓後半不對 10/20 22:04
→ LPH66: 它想做的跟 ex1 是一樣的, 兩者差別就只是五樓說的這樣而已 10/20 22:04
推 jammy50605: 如果要跟ex1一樣只改字串中的單一字元是辦不到的 10/21 00:37
→ jammy50605: 因為你的str是字元指標會指到一個字串 10/21 00:37
→ jammy50605: 他並沒有像字元陣列有偏移的概念 所以不能拿str改字元 10/21 00:38
→ jammy50605: 所以*str跟*str[0]是一樣意思 都是不行的~ 10/21 00:45
推 LPH66: 唔嗯, C 語言的字串就只是個尾巴有個 '\0' 的字元陣列而已 10/21 00:58
→ LPH66: 所以 ex2 之所以做不到的原因完全是因為唯讀 10/21 00:59
推 jammy50605: 喔喔 LPH66大大說的才是對的 系統會找個位址放字串常 10/21 01:41
→ jammy50605: 數 然後把位址回傳給str 但這個位址系統不給用(唯獨) 10/21 01:42
推 loveflames: 字元指標一樣有偏移的概念,a[b]等同*(a+b)等同b[a] 10/21 01:44
→ jammy50605: 只能重新讓系統找新的位址放字串常數 回傳字串常數的 10/21 01:44
→ jammy50605: 位址這樣 受教了~~ 10/21 01:44
推 loveflames: 所以*str等同str[0]跟0[str] 10/21 01:46
推 loveflames: 第二個是因為str指向唯讀區,*str相當於修改唯讀區 10/21 01:50
→ kdok123: 原來如此! 感謝各位解答! 10/22 10:58