[問題] 為何動態記憶體配置不能先賦值再strcat?

看板C_and_CPP作者 (1)時間11年前 (2013/11/16 11:00), 編輯推噓7(7016)
留言23則, 12人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 問題(Question): 從問題十三誡第四條延伸思考,遇到的問題,想請大家幫忙解惑一下 (1) 這是十三誡第四條原本的用法 char s1[20] = "Hello, "; char *s2 = "world!"; strcat(s1, s2); (2) 黃色的部份執行就會出現segmentation fault char *s1 = new char[20]; s1 = "Hello, "; char *s2 = "world!"; strcat(s1, s2); (3) 黃色的部份執行就會出現segmentation fault char *s1 = (char *)malloc(20*sizeof(char)); s1 = "Hello, "; char *s2 = "world!"; strcat(s1, s2); 小弟的困惑是: (2)和(3)都用動態記憶體配置,應該是合法的空間了不是嗎? 為什麼這樣用還會有問題呢? 謝謝大家! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.176.221.68

11/16 19:01, , 1F
但是 "Hello, " 不是
11/16 19:01, 1F

11/16 19:03, , 2F
請查字串用=與strcpy的差別
11/16 19:03, 2F

11/16 19:41, , 3F
請問您看十三誡時, 有選 4 進去完整看完 04. 的兩頁內容嗎?
11/16 19:41, 3F

11/16 19:48, , 4F
啊~~~ 剛沒注意看. 原 PO 的困惑看來很可能是2樓所提的情況.
11/16 19:48, 4F

11/16 20:03, , 5F
new char[20]{"hello,would"};
11/16 20:03, 5F

11/17 00:04, , 6F
new char[20]{"hello,world"}; 這要 c++11 才 support.
11/17 00:04, 6F

11/17 01:04, , 7F
宣告時的初始化編譯器會好心幫你複製 之後只能用strcpy
11/17 01:04, 7F

11/17 01:05, , 8F
因為 s1 是 pointer to char,而當你用 = 去 assign 新的
11/17 01:05, 8F

11/17 01:06, , 9F
address 給他的時候,之前配置的 address 會被蓋掉,配置
11/17 01:06, 9F

11/17 01:07, , 10F
的空間就變得沒有指標指向它,而成了孤兒。
11/17 01:07, 10F

11/17 01:08, , 11F
而問題就在於我們不希望有任何孤兒。
11/17 01:08, 11F

11/17 01:09, , 12F
以及後來指向的位址是一個靜態字串,是唯讀的。
11/17 01:09, 12F

11/17 01:12, , 13F
'變成孤兒'應該不是seg fault的原因
11/17 01:12, 13F

11/17 10:10, , 14F
謝謝大家 了解不能的原因了
11/17 10:10, 14F

11/17 10:11, , 15F
但應該是變成孤兒而已,但為何會seg fault呢?
11/17 10:11, 15F

11/17 10:33, , 16F
因為 "Hello, " 唯讀
11/17 10:33, 16F

11/17 10:59, , 17F
請問是說 "Hello, " 是 const char * 的緣故嗎?
11/17 10:59, 17F

11/17 11:31, , 18F
不是 是因為字串本人資料 放在rodata segment
11/17 11:31, 18F

11/17 11:32, , 19F
read-only的data segment <- 可查關鍵字
11/17 11:32, 19F

11/18 00:21, , 20F
這時候就要再推"程式設計師的自我修養"了XD
11/18 00:21, 20F

11/18 09:25, , 21F
請問樓上c大說的那本書和這個問題的關係是?? @@
11/18 09:25, 21F

11/18 12:28, , 22F
樓上上, 那本是 "程式設計師"的..., 不是 "程式初學者"的...,
11/18 12:28, 22F

11/18 12:29, , 23F
所以可能太為難原PO了吧...
11/18 12:29, 23F
文章代碼(AID): #1IXr1bqh (C_and_CPP)