看板 C_and_CPP 關於我們 聯絡資訊
各位好: 請問下面這一段程式有什麼問題嗎 void getMemory(char* p, int num) {   p = (char*)malloc(sizeof(char)*num); } void main() {   char* str = NULL;   getMemory(str, 100);   strcpy(str, "Hello"); } 執行時會在 strcpy(str, "Hello") 發生錯誤 是因為用 malloc 產生的動態字元陣列不能以 strcpy 分配值嗎? 那正確寫法應該是怎麼樣呢? 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.137.81.146
fragileness:你malloc的動作不要包在function裡 直接在外面試試看 10/02 00:09
QQ29:此p非str 你p malloc跳出副程式 就沒人管的到了 leak.... 10/02 00:09
QQ29:str 實際上還是null 10/02 00:10
QQ29:你可以傳進去寫char *&p去接 就ok 10/02 00:10
QQ29:你寫純C 那就用str=getMemory() 把new的那塊return回來 10/02 00:11
VictorTom:這也是一個典型的call by value的問題....@_@" 10/02 00:11
softwind:getMemory(char** p /*...*/ *p = malloc(...) 10/02 00:12
QQ29:用s大的方式要傳&str進去 記得改 10/02 00:13
softwind:沒關係啦 不改會有error message, OK的 10/02 00:15
james732:這個問題我以前也想不通 比單純的call by value難一點 10/02 00:22
QQ29:說這是call by value是因為傳的是 記憶體位址這個值嘛 10/02 00:24
bayes:我一直以為以 malloc() 取得的記憶體要用 free() 才會釋放 10/02 00:54
bayes:所以跳出副程式後應該還是存在,而且被 str 指到 10/02 00:55
james732:樓上說的沒錯啊 這樣的寫法並沒有釋放 10/02 00:55
softwind:我也是這樣以為阿~ 我錯了嗎??? google中... 10/02 00:56
bayes:這麼一來 str 不就等於 p 10/02 00:56
bayes:是我觀念錯了嗎? 10/02 00:57
QQ29:你一開始的觀念 str等於p 這是錯的 10/02 01:01
QQ29:int *p1=new int; int*p2; p2=p1; p2=new int;你覺得p1會 10/02 01:02
QQ29:跟著new一塊新的記憶體嘛? 顯然不會 這就類似你現在寫的 10/02 01:02
QQ29:p1是str p2是你所寫的p p去new 不代表str也跟著new了 10/02 01:03
fragileness:的確沒有被釋放 只是從頭到尾沒有被str指到 10/02 01:15
larryho:那這樣可以在main裡free嗎? 10/02 09:20
james732:可以 10/02 12:06