[問題] 請教字元陣列與字串指標的差異?

看板C_and_CPP作者 (PHI)時間12年前 (2011/10/12 10:20), 編輯推噓4(4053)
留言57則, 9人參與, 最新討論串1/1
各位前輩您好: 小弟最近在研讀C的指標,但有一處就是很疑惑,想請教各位大大 char *str = "test"; 與 char str[] = "test"; 本質上究竟有沒有差異呢? 或是說什麼時候一定要用 char *str ? 什麼時候一定要用 char str[] 呢? PS.其實小弟是在玩"雙重指標"的時候遇到這樣的疑問的,麻煩各位大大往這個方向解惑 感恩感恩!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.75.189.169

10/12 10:28, , 1F
置底文十三戒第四
10/12 10:28, 1F

10/12 10:30, , 2F
其實char *str很單純指向char空間而已.[]<--這個是讓很
10/12 10:30, 2F

10/12 10:31, , 3F
多新手產生迷惑地方.第二個例子是char str[5] = "test";
10/12 10:31, 3F

10/12 10:32, , 4F
第一個是宣告一個指向const字串的指標 第二個是直接配
10/12 10:32, 4F

10/12 10:32, , 5F
你創造一個陣列空間,且把test放入而已
10/12 10:32, 5F

10/12 10:32, , 6F
置好空間然後初始化為指定的字串
10/12 10:32, 6F

10/12 10:33, , 7F
所以你如果加一行str[0] = 'a' 前者就會seg fault了
10/12 10:33, 7F

10/12 10:46, , 8F
http://codepad.org/KSh9wBdz 可以正常更改說...
10/12 10:46, 8F

10/12 10:47, , 9F
抱歉我搞錯了=.=
10/12 10:47, 9F

10/12 10:48, , 10F
第一個寫法若加上 str[0]='a' 結果是 undefined
10/12 10:48, 10F

10/12 10:49, , 11F
意思是任何情況都有可能 (包括什麼事都沒發生)
10/12 10:49, 11F

10/12 10:51, , 12F
http://codepad.org/8UHaqO21 請問各位大大這個觀念
10/12 10:51, 12F

10/12 10:51, , 13F
對不對qq?
10/12 10:51, 13F

10/12 12:50, , 14F
a="vvv"<--這個馬上就出問題了,請改快去看十三戒
10/12 12:50, 14F

10/12 13:34, , 15F
@diabloevagto:不完全對,char* a="xx" ,os是會為它配空
10/12 13:34, 15F

10/12 13:35, , 16F
間存進去,但要視該空間為"唯讀",不能再去改.
10/12 13:35, 16F

10/12 14:09, , 17F
@diabloevagto *a = "vvv"不會成功的理由不是唯讀
10/12 14:09, 17F

10/12 14:10, , 18F
是因為型別錯了,如果a = "vvv"還是會成功
10/12 14:10, 18F

10/12 14:11, , 19F
會導致本來指向"AAA"這個常數字串的指標a改指向常數字串"vvv"
10/12 14:11, 19F

10/12 14:12, , 20F
如果不懂後面的架構的話,我建議初學者要做的事就是
10/12 14:12, 20F

10/12 14:12, , 21F
請「完全不要」用等號去操作c式字串
10/12 14:12, 21F

10/12 14:14, , 22F
感謝 priv 補充指正。
10/12 14:14, 22F

10/12 14:16, , 23F
char str[] = "test";一行宣告其實後面是三個動作
10/12 14:16, 23F

10/12 14:16, , 24F
相當於先宣告char str[5]後,用strcpy把"test"拷進str[]
10/12 14:16, 24F

10/12 14:17, , 25F
char *str = "test"則沒有產生陣列空間的這個動作
10/12 14:17, 25F

10/12 14:18, , 26F
單純把str這個指標指向常數字串"test"
10/12 14:18, 26F

10/12 14:21, , 27F
先學過別的語言的人很容易發生這種認知上的誤解
10/12 14:21, 27F

10/12 14:21, , 28F
char *str和char str[]操作上的差別對初學者來說最重要的只有
10/12 14:21, 28F

10/12 14:22, , 29F
陣列宣告的時候會配空間,指標宣告的時候不會
10/12 14:22, 29F

10/12 14:22, , 30F
所以如果要使幅char*去處理字串你必需指向我們自己配置的空間
10/12 14:22, 30F

10/12 14:23, , 31F
例如說指向另一個char [],或者用malloc手動配置空間
10/12 14:23, 31F

10/12 16:58, , 32F
我就是想說要重新指向令一個字串,請問問題是出在說
10/12 16:58, 32F

10/12 16:59, , 33F
我應該要先把就有的空間釋放,然後再重新指向令一個
10/12 16:59, 33F

10/12 16:59, , 34F
新創造出來的空間嗎?麻煩大家指教了!
10/12 16:59, 34F

10/12 17:12, , 35F
c如果字串不是很長通常都是直接開一個陣列,都在裡面操作
10/12 17:12, 35F

10/12 17:12, , 36F
要改變字串內容的時候用strcpy去置換
10/12 17:12, 36F

10/12 17:16, , 37F
在程式裡面所有的"ooxxx"這樣的字串,經過編譯後
10/12 17:16, 37F

10/12 17:17, , 38F
都會放在程式的data區段,這部份你是不需要去free的
10/12 17:17, 38F

10/12 17:17, , 39F
如果只是單純指向一個字串取它的值來用,用等於可以
10/12 17:17, 39F

10/12 17:17, , 40F
怕就怕一知半解,你又想用char*去改變字串的部份內容
10/12 17:17, 40F

10/12 17:19, , 41F
建議diabloevagto把問題寫得更具體一點
10/12 17:19, 41F

10/12 17:19, , 42F
最近看板上很多人學C好像都先寫再說
10/12 17:19, 42F

10/12 17:19, , 43F
所以是說,重新指向是合理的,但還是不建議這樣使用
10/12 17:19, 43F

10/12 17:19, , 44F
我們以前學C都是先抄sample然後試著看懂它,再寫習題
10/12 17:19, 44F

10/12 17:20, , 45F
,另外要記得不要用char*去改變其中一個數值
10/12 17:20, 45F

10/12 17:20, , 46F
我覺得很多問題你按步就班每個章節寫個幾題就不會問了
10/12 17:20, 46F

10/12 17:21, , 47F
不好意思...因為幾乎都在用string,像是char比較少用
10/12 17:21, 47F

10/12 17:22, , 48F
學C的話就C Programming Language找一本來看吧,中英都可
10/12 17:22, 48F

10/12 17:22, , 49F
二百多頁的小書,要查要看都看快
10/12 17:22, 49F

10/12 21:49, , 50F
K&R 本對初學者有點太難了吧XD
10/12 21:49, 50F

10/12 22:06, , 51F
先去把Q&A看完再講
10/12 22:06, 51F

10/12 23:19, , 52F
我覺得13戒就是一個非常好的範本了,但是沒人去鳥他
10/12 23:19, 52F

10/12 23:20, , 53F
我有鳥啊,一樓就推了XD
10/12 23:20, 53F

10/12 23:20, , 54F
這是我一直覺得很不喜歡的地方.
10/12 23:20, 54F

10/12 23:21, , 55F
james732...不是說你,我是只剛近來發問的人
10/12 23:21, 55F

10/12 23:21, , 56F
而且你對話有點...
10/12 23:21, 56F

10/12 23:22, , 57F
其實我本來沒那個意思....XD
10/12 23:22, 57F
文章代碼(AID): #1EbFboar (C_and_CPP)