推 stupid0319: 要有記憶體空間的概念才能弄懂指標跟字串吧 04/12 22:57
→ stupid0319: str[]中的str像是指標,但他只能指向固定陣列 04/12 23:00
→ stupid0319: char *str的str是指標,你要指向誰都沒人理你 04/12 23:02
→ wtchen: char *str="Hello"; str="Goodbye";編譯會過但不見得OK 04/12 23:05
→ wtchen: 請看置底的13誡第4點 04/12 23:05
→ stupid0319: 他沒改字串常數啦,只是指向另一個字串 04/12 23:06
→ stupid0319: 不過這樣寫怪怪的就是了 04/12 23:07
推 wtchen: str的空間沒配治好不會segmentation fault? 04/12 23:12
→ LiloHuang: string literal 本來已經放在 data segment 了 04/12 23:15
→ LiloHuang: str[0] = 'x'; 這個才是置底的13誡第4點要講的 04/12 23:16
→ LiloHuang: string literal 不是放在 stack 也不是放在 heap 04/12 23:18
→ LiloHuang: data segment 配置跟初始化是 program loader 要做的事 04/12 23:24
推 wtchen: 可是13誡第4點Page2有提到配置空間要足夠不然你把他變成 04/12 23:29
→ wtchen: 長一點的字串就有可能出問題 04/12 23:30
→ LiloHuang: 我講的是兩件事情...字串常數跟字元陣列是兩件事情 04/12 23:59
→ LiloHuang: 13-4-2 提到的配置空間足夠,指的是如果要把字串相接 04/13 00:01
→ LiloHuang: 到一個字元陣列,其陣列大小要足夠。 04/13 00:01
→ LiloHuang: 而字元常數,空間不需要自己去配置,也不可以去修改它 04/13 00:06
→ LiloHuang: 而原po重新把字元指標指到另一個字元常數,這寫法無誤 04/13 00:07
→ LiloHuang: 語法上字元常數無法塞給字元陣列,因此編譯期就會錯誤 04/13 00:09
推 ko27tye: 因為你不能用陣列去初始化另一個陣列 04/13 00:11
推 Frozenmouse: 應該不是初始化而是給值,像下面這樣也是不行的: 04/13 09:36
推 Frozenmouse: 總之就是語法上的限制 ._. 04/13 09:38
推 weiclin: char str[] = "Hello" 等於 char str[6] = "Hello" 04/13 10:19
→ weiclin: 他是陣列, 只是編譯器幫你計算了長度 04/13 10:19
→ weiclin: 你可以自由修改陣列內的值,不會有問題 04/13 10:22
→ weiclin: char *str="Hello" 是一個指標指向系統某個唯讀的字串 04/13 10:23
→ weiclin: 你可以把他指到另一個字串,但不能改他: str[0]='N' 04/13 10:24
推 LiloHuang: 通常指向 string literal 都會加上 const 來避免犯錯 04/13 12:48
→ TobyH4cker: 怎麼只有我覺得原PO只是想把新的字串放進原陣列...... 04/14 09:16
推 Frozenmouse: 他是要這樣沒錯啊…只是他用的語法上不可行 04/14 11:46
推 tony21177: 依照K&R 2 array name str不是變數,不能做assignment 04/17 10:18