看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
Feis:但是 "Hello, " 不是 11/16 19:01
james732:請查字串用=與strcpy的差別 11/16 19:03
yvb:請問您看十三誡時, 有選 4 進去完整看完 04. 的兩頁內容嗎? 11/16 19:41
yvb:啊~~~ 剛沒注意看. 原 PO 的困惑看來很可能是2樓所提的情況. 11/16 19:48
soheadsome:new char[20]{"hello,would"}; 11/16 20:03
EdisonX:new char[20]{"hello,world"}; 這要 c++11 才 support. 11/17 00:04
chunhsiang:宣告時的初始化編譯器會好心幫你複製 之後只能用strcpy 11/17 01:04
linotwo:因為 s1 是 pointer to char,而當你用 = 去 assign 新的 11/17 01:05
linotwo:address 給他的時候,之前配置的 address 會被蓋掉,配置 11/17 01:06
linotwo:的空間就變得沒有指標指向它,而成了孤兒。 11/17 01:07
linotwo:而問題就在於我們不希望有任何孤兒。 11/17 01:08
linotwo:以及後來指向的位址是一個靜態字串,是唯讀的。 11/17 01:09
shaopin:'變成孤兒'應該不是seg fault的原因 11/17 01:12
Hyozero:謝謝大家 了解不能的原因了 11/17 10:10
Hyozero:但應該是變成孤兒而已,但為何會seg fault呢? 11/17 10:11
Bencrie:因為 "Hello, " 唯讀 11/17 10:33
Hyozero:請問是說 "Hello, " 是 const char * 的緣故嗎? 11/17 10:59
purincess:不是 是因為字串本人資料 放在rodata segment 11/17 11:31
purincess:read-only的data segment <- 可查關鍵字 11/17 11:32
cobrasgo:這時候就要再推"程式設計師的自我修養"了XD 11/18 00:21
Hyozero:請問樓上c大說的那本書和這個問題的關係是?? @@ 11/18 09:25
yvb:樓上上, 那本是 "程式設計師"的..., 不是 "程式初學者"的..., 11/18 12:28
yvb:所以可能太為難原PO了吧... 11/18 12:29