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

看板C_and_CPP (C/C++)作者 (桓桓)時間10年前 (2016/04/12 22:54), 編輯推噓10(10024)
留言34則, 8人參與, 最新討論串1/2 (看更多)
大家好,我是剛學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

04/12 22:57, , 1F
要有記憶體空間的概念才能弄懂指標跟字串吧
04/12 22:57, 1F

04/12 23:00, , 2F
str[]中的str像是指標,但他只能指向固定陣列
04/12 23:00, 2F

04/12 23:02, , 3F
char *str的str是指標,你要指向誰都沒人理你
04/12 23:02, 3F

04/12 23:05, , 4F
char *str="Hello"; str="Goodbye";編譯會過但不見得OK
04/12 23:05, 4F

04/12 23:05, , 5F
請看置底的13誡第4點
04/12 23:05, 5F

04/12 23:06, , 6F
他沒改字串常數啦,只是指向另一個字串
04/12 23:06, 6F

04/12 23:07, , 7F
不過這樣寫怪怪的就是了
04/12 23:07, 7F

04/12 23:12, , 8F
str的空間沒配治好不會segmentation fault?
04/12 23:12, 8F

04/12 23:15, , 9F
string literal 本來已經放在 data segment 了
04/12 23:15, 9F

04/12 23:16, , 10F
str[0] = 'x'; 這個才是置底的13誡第4點要講的
04/12 23:16, 10F

04/12 23:18, , 11F
string literal 不是放在 stack 也不是放在 heap
04/12 23:18, 11F

04/12 23:24, , 12F
data segment 配置跟初始化是 program loader 要做的事
04/12 23:24, 12F

04/12 23:29, , 13F
可是13誡第4點Page2有提到配置空間要足夠不然你把他變成
04/12 23:29, 13F

04/12 23:30, , 14F
長一點的字串就有可能出問題
04/12 23:30, 14F

04/12 23:59, , 15F
我講的是兩件事情...字串常數跟字元陣列是兩件事情
04/12 23:59, 15F

04/13 00:01, , 16F
13-4-2 提到的配置空間足夠,指的是如果要把字串相接
04/13 00:01, 16F

04/13 00:01, , 17F
到一個字元陣列,其陣列大小要足夠。
04/13 00:01, 17F

04/13 00:06, , 18F
而字元常數,空間不需要自己去配置,也不可以去修改它
04/13 00:06, 18F

04/13 00:07, , 19F
而原po重新把字元指標指到另一個字元常數,這寫法無誤
04/13 00:07, 19F

04/13 00:09, , 20F
語法上字元常數無法塞給字元陣列,因此編譯期就會錯誤
04/13 00:09, 20F

04/13 00:11, , 21F
因為你不能用陣列去初始化另一個陣列
04/13 00:11, 21F

04/13 09:36, , 22F
應該不是初始化而是給值,像下面這樣也是不行的:
04/13 09:36, 22F

04/13 09:36, , 23F

04/13 09:38, , 24F
總之就是語法上的限制 ._.
04/13 09:38, 24F

04/13 10:19, , 25F
char str[] = "Hello" 等於 char str[6] = "Hello"
04/13 10:19, 25F

04/13 10:19, , 26F
他是陣列, 只是編譯器幫你計算了長度
04/13 10:19, 26F

04/13 10:22, , 27F
你可以自由修改陣列內的值,不會有問題
04/13 10:22, 27F

04/13 10:23, , 28F
char *str="Hello" 是一個指標指向系統某個唯讀的字串
04/13 10:23, 28F

04/13 10:24, , 29F
你可以把他指到另一個字串,但不能改他: str[0]='N'
04/13 10:24, 29F

04/13 12:48, , 30F
通常指向 string literal 都會加上 const 來避免犯錯
04/13 12:48, 30F

04/13 12:50, , 31F
有興趣閱讀更多細節的,請自己看 http://goo.gl/5GFnAn
04/13 12:50, 31F

04/14 09:16, , 32F
怎麼只有我覺得原PO只是想把新的字串放進原陣列......
04/14 09:16, 32F

04/14 11:46, , 33F
他是要這樣沒錯啊…只是他用的語法上不可行
04/14 11:46, 33F

04/17 10:18, , 34F
依照K&R 2 array name str不是變數,不能做assignment
04/17 10:18, 34F
文章代碼(AID): #1N3GmsP7 (C_and_CPP)
文章代碼(AID): #1N3GmsP7 (C_and_CPP)