作者phi61023 (PHI)
看板C_and_CPP
標題[問題] 請教字元陣列與字串指標的差異?
時間Wed Oct 12 10:20:31 2011
各位前輩您好:
小弟最近在研讀C的指標,但有一處就是很疑惑,想請教各位大大
char *str = "test";
與
char str[] = "test";
本質上究竟有沒有差異呢?
或是說什麼時候一定要用 char *str ?
什麼時候一定要用 char str[] 呢?
PS.其實小弟是在玩"雙重指標"的時候遇到這樣的疑問的,麻煩各位大大往這個方向解惑
感恩感恩!!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.75.189.169
推 james732:置底文十三戒第四 10/12 10:28
→ angleevil:其實char *str很單純指向char空間而已.[]<--這個是讓很 10/12 10:30
→ angleevil:多新手產生迷惑地方.第二個例子是char str[5] = "test"; 10/12 10:31
推 shadow0326:第一個是宣告一個指向const字串的指標 第二個是直接配 10/12 10:32
→ angleevil:你創造一個陣列空間,且把test放入而已 10/12 10:32
→ shadow0326:置好空間然後初始化為指定的字串 10/12 10:32
→ shadow0326:所以你如果加一行str[0] = 'a' 前者就會seg fault了 10/12 10:33
→ diabloevagto:抱歉我搞錯了=.= 10/12 10:47
推 littleshan:第一個寫法若加上 str[0]='a' 結果是 undefined 10/12 10:48
→ littleshan:意思是任何情況都有可能 (包括什麼事都沒發生) 10/12 10:49
→ diabloevagto:對不對qq? 10/12 10:51
→ angleevil:a="vvv"<--這個馬上就出問題了,請改快去看十三戒 10/12 12:50
→ tropical72:@diabloevagto:不完全對,char* a="xx" ,os是會為它配空 10/12 13:34
→ tropical72:間存進去,但要視該空間為"唯讀",不能再去改. 10/12 13:35
→ priv:@diabloevagto *a = "vvv"不會成功的理由不是唯讀 10/12 14:09
→ priv:是因為型別錯了,如果a = "vvv"還是會成功 10/12 14:10
→ priv:會導致本來指向"AAA"這個常數字串的指標a改指向常數字串"vvv" 10/12 14:11
→ priv:如果不懂後面的架構的話,我建議初學者要做的事就是 10/12 14:12
→ priv:請「完全不要」用等號去操作c式字串 10/12 14:12
推 tropical72:感謝 priv 補充指正。 10/12 14:14
→ priv:char str[] = "test";一行宣告其實後面是三個動作 10/12 14:16
→ priv:相當於先宣告char str[5]後,用strcpy把"test"拷進str[] 10/12 14:16
→ priv:char *str = "test"則沒有產生陣列空間的這個動作 10/12 14:17
→ priv:單純把str這個指標指向常數字串"test" 10/12 14:18
→ priv:先學過別的語言的人很容易發生這種認知上的誤解 10/12 14:21
→ priv:char *str和char str[]操作上的差別對初學者來說最重要的只有 10/12 14:21
→ priv:陣列宣告的時候會配空間,指標宣告的時候不會 10/12 14:22
→ priv:所以如果要使幅char*去處理字串你必需指向我們自己配置的空間 10/12 14:22
→ priv:例如說指向另一個char [],或者用malloc手動配置空間 10/12 14:23
→ diabloevagto:我就是想說要重新指向令一個字串,請問問題是出在說 10/12 16:58
→ diabloevagto:我應該要先把就有的空間釋放,然後再重新指向令一個 10/12 16:59
→ diabloevagto:新創造出來的空間嗎?麻煩大家指教了! 10/12 16:59
→ priv:c如果字串不是很長通常都是直接開一個陣列,都在裡面操作 10/12 17:12
→ priv:要改變字串內容的時候用strcpy去置換 10/12 17:12
→ priv:在程式裡面所有的"ooxxx"這樣的字串,經過編譯後 10/12 17:16
→ priv:都會放在程式的data區段,這部份你是不需要去free的 10/12 17:17
→ priv:如果只是單純指向一個字串取它的值來用,用等於可以 10/12 17:17
→ priv:怕就怕一知半解,你又想用char*去改變字串的部份內容 10/12 17:17
→ james732:建議diabloevagto把問題寫得更具體一點 10/12 17:19
→ priv:最近看板上很多人學C好像都先寫再說 10/12 17:19
→ diabloevagto:所以是說,重新指向是合理的,但還是不建議這樣使用 10/12 17:19
→ priv:我們以前學C都是先抄sample然後試著看懂它,再寫習題 10/12 17:19
→ diabloevagto:,另外要記得不要用char*去改變其中一個數值 10/12 17:20
→ priv:我覺得很多問題你按步就班每個章節寫個幾題就不會問了 10/12 17:20
→ diabloevagto:不好意思...因為幾乎都在用string,像是char比較少用 10/12 17:21
→ priv:學C的話就C Programming Language找一本來看吧,中英都可 10/12 17:22
→ priv:二百多頁的小書,要查要看都看快 10/12 17:22
→ xatier:K&R 本對初學者有點太難了吧XD 10/12 21:49
→ firejox:先去把Q&A看完再講 10/12 22:06
→ angleevil:我覺得13戒就是一個非常好的範本了,但是沒人去鳥他 10/12 23:19
→ james732:我有鳥啊,一樓就推了XD 10/12 23:20
→ angleevil:這是我一直覺得很不喜歡的地方. 10/12 23:20
→ angleevil:james732...不是說你,我是只剛近來發問的人 10/12 23:21
→ angleevil:而且你對話有點... 10/12 23:21
→ james732:其實我本來沒那個意思....XD 10/12 23:22