[問題] 陣列與字串的疑問

作者: auto402749 (桓桓)   2016-04-12 22:54:43
大家好,我是剛學c語言指標的新手
在書上關於陣列和字串的關係有點疑問
如果 char str[ ]="Hello";
那下一行打 str="Goodbye";
為甚麼會出現編譯錯誤?
用成指標
char *str="Hello";
下一行打 str="Goodbye";
卻能夠編譯
想請問各位,為甚麼陣列不能再指定一個新的字串到str裡
謝謝!!
作者: stupid0319 (徵女友)   2016-04-12 22:57:00
要有記憶體空間的概念才能弄懂指標跟字串吧str[]中的str像是指標,但他只能指向固定陣列char *str的str是指標,你要指向誰都沒人理你
作者: wtchen (沒有存在感的人)   2016-04-12 23:05:00
char *str="Hello"; str="Goodbye";編譯會過但不見得OK請看置底的13誡第4點
作者: stupid0319 (徵女友)   2016-04-12 23:06:00
他沒改字串常數啦,只是指向另一個字串不過這樣寫怪怪的就是了
作者: wtchen (沒有存在感的人)   2016-04-12 23:12:00
str的空間沒配治好不會segmentation fault?
作者: LiloHuang (十年一刻)   2016-04-12 23:15:00
string literal 本來已經放在 data segment 了str[0] = 'x'; 這個才是置底的13誡第4點要講的string literal 不是放在 stack 也不是放在 heapdata segment 配置跟初始化是 program loader 要做的事
作者: wtchen (沒有存在感的人)   2016-04-12 23:29:00
可是13誡第4點Page2有提到配置空間要足夠不然你把他變成長一點的字串就有可能出問題
作者: LiloHuang (十年一刻)   2016-04-12 23:59:00
我講的是兩件事情...字串常數跟字元陣列是兩件事情13-4-2 提到的配置空間足夠,指的是如果要把字串相接到一個字元陣列,其陣列大小要足夠。而字元常數,空間不需要自己去配置,也不可以去修改它而原po重新把字元指標指到另一個字元常數,這寫法無誤語法上字元常數無法塞給字元陣列,因此編譯期就會錯誤
作者: ko27tye (好滋好滋)   2016-04-13 00:11:00
因為你不能用陣列去初始化另一個陣列
作者: Frozenmouse (*冰之鼠*)   2016-04-13 09:36:00
應該不是初始化而是給值,像下面這樣也是不行的:https://ideone.com/zFaC6o總之就是語法上的限制 ._.
作者: weiclin (CC)   2016-04-13 10:19:00
char str[] = "Hello" 等於 char str[6] = "Hello"他是陣列, 只是編譯器幫你計算了長度你可以自由修改陣列內的值,不會有問題char *str="Hello" 是一個指標指向系統某個唯讀的字串你可以把他指到另一個字串,但不能改他: str[0]='N'
作者: LiloHuang (十年一刻)   2016-04-13 12:48:00
通常指向 string literal 都會加上 const 來避免犯錯有興趣閱讀更多細節的,請自己看 http://goo.gl/5GFnAn
作者: TobyH4cker (Toby (我要當好人))   2016-04-14 09:16:00
怎麼只有我覺得原PO只是想把新的字串放進原陣列......
作者: Frozenmouse (*冰之鼠*)   2016-04-14 11:46:00
他是要這樣沒錯啊…只是他用的語法上不可行
作者: tony21177   2016-04-17 10:18:00
依照K&R 2 array name str不是變數,不能做assignment

Links booklink

Contact Us: admin [ a t ] ucptt.com