[問題] 字串賦值問題

作者: kdok123 (小天)   2014-10-19 23:33:09
ex1:
char str[6] = "hello";
*str = 'x';
// 編譯通過
ex2:
char *str = "hello";
*str = 'x';
//編譯失敗
想請問是為什麼呢?
作者: LPH66 (-6.2598534e+18f)   2014-10-19 23:41:00
置底十三誡之四
作者: jammy50605 (小刀)   2014-10-20 00:06:00
ex1的str是陣列第一個元素的位址 會變成xelloex2的str是字元指標 字元指標重新指定字串要 str='x'字串會整個被改成x 而且應該要用雙引號代表字串"x"
作者: loveflames (咕啾咕啾魔法陣)   2014-10-20 00:31:00
第二個指向唯讀區,就算能編譯也不能執行
作者: uranusjr (←這人是超級笨蛋)   2014-10-20 00:53:00
不過原來這樣會 error 啊, 我一直以為會通過然後 crash
作者: johnpage (johnpage)   2014-10-20 00:58:00
死背
作者: LPH66 (-6.2598534e+18f)   2014-10-20 22:04:00
連這都要死背的話還是別寫程式吧 (望) 另外四樓後半不對它想做的跟 ex1 是一樣的, 兩者差別就只是五樓說的這樣而已
作者: jammy50605 (小刀)   2014-10-21 00:37:00
如果要跟ex1一樣只改字串中的單一字元是辦不到的因為你的str是字元指標會指到一個字串他並沒有像字元陣列有偏移的概念 所以不能拿str改字元所以*str跟*str[0]是一樣意思 都是不行的~
作者: LPH66 (-6.2598534e+18f)   2014-10-21 00:58:00
唔嗯, C 語言的字串就只是個尾巴有個 '\0' 的字元陣列而已所以 ex2 之所以做不到的原因完全是因為唯讀
作者: jammy50605 (小刀)   2014-10-21 01:41:00
喔喔 LPH66大大說的才是對的 系統會找個位址放字串常數 然後把位址回傳給str 但這個位址系統不給用(唯獨)
作者: loveflames (咕啾咕啾魔法陣)   2014-10-21 01:44:00
字元指標一樣有偏移的概念,a[b]等同*(a+b)等同b[a]
作者: jammy50605 (小刀)   2014-10-21 01:44:00
只能重新讓系統找新的位址放字串常數 回傳字串常數的位址這樣 受教了~~
作者: loveflames (咕啾咕啾魔法陣)   2014-10-21 01:46:00
所以*str等同str[0]跟0[str]第二個是因為str指向唯讀區,*str相當於修改唯讀區
作者: kdok123 (小天)   2014-10-22 10:58:00
原來如此! 感謝各位解答!

Links booklink

Contact Us: admin [ a t ] ucptt.com