看板 C_and_CPP 關於我們 聯絡資訊
大家好,我是剛學c語言指標的新手 在書上關於陣列和字串的關係有點疑問 如果 char str[ ]="Hello"; 那下一行打 str="Goodbye"; 為甚麼會出現編譯錯誤? 用成指標 char *str="Hello"; 下一行打 str="Goodbye"; 卻能夠編譯 想請問各位,為甚麼陣列不能再指定一個新的字串到str裡 謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 120.113.124.113 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460472886.A.647.html
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: https://ideone.com/zFaC6o 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
LiloHuang: 有興趣閱讀更多細節的,請自己看 http://goo.gl/5GFnAn 04/13 12:50
TobyH4cker: 怎麼只有我覺得原PO只是想把新的字串放進原陣列...... 04/14 09:16
Frozenmouse: 他是要這樣沒錯啊…只是他用的語法上不可行 04/14 11:46
tony21177: 依照K&R 2 array name str不是變數,不能做assignment 04/17 10:18