[問題] C 的字串與記憶體問題

看板C_and_CPP (C/C++)作者 (貝斯)時間16年前 (2009/10/02 00:04), 編輯推噓2(2022)
留言24則, 7人參與, 最新討論串1/3 (看更多)
各位好: 請問下面這一段程式有什麼問題嗎 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

10/02 00:09, , 1F
你malloc的動作不要包在function裡 直接在外面試試看
10/02 00:09, 1F

10/02 00:09, , 2F
此p非str 你p malloc跳出副程式 就沒人管的到了 leak....
10/02 00:09, 2F

10/02 00:10, , 3F
str 實際上還是null
10/02 00:10, 3F

10/02 00:10, , 4F
你可以傳進去寫char *&p去接 就ok
10/02 00:10, 4F

10/02 00:11, , 5F
你寫純C 那就用str=getMemory() 把new的那塊return回來
10/02 00:11, 5F

10/02 00:11, , 6F
這也是一個典型的call by value的問題....@_@"
10/02 00:11, 6F

10/02 00:12, , 7F
getMemory(char** p /*...*/ *p = malloc(...)
10/02 00:12, 7F

10/02 00:13, , 8F
用s大的方式要傳&str進去 記得改
10/02 00:13, 8F

10/02 00:15, , 9F
沒關係啦 不改會有error message, OK的
10/02 00:15, 9F

10/02 00:22, , 10F
這個問題我以前也想不通 比單純的call by value難一點
10/02 00:22, 10F

10/02 00:24, , 11F
說這是call by value是因為傳的是 記憶體位址這個值嘛
10/02 00:24, 11F

10/02 00:54, , 12F
我一直以為以 malloc() 取得的記憶體要用 free() 才會釋放
10/02 00:54, 12F

10/02 00:55, , 13F
所以跳出副程式後應該還是存在,而且被 str 指到
10/02 00:55, 13F

10/02 00:55, , 14F
樓上說的沒錯啊 這樣的寫法並沒有釋放
10/02 00:55, 14F

10/02 00:56, , 15F
我也是這樣以為阿~ 我錯了嗎??? google中...
10/02 00:56, 15F

10/02 00:56, , 16F
這麼一來 str 不就等於 p
10/02 00:56, 16F

10/02 00:57, , 17F
是我觀念錯了嗎?
10/02 00:57, 17F

10/02 01:01, , 18F
你一開始的觀念 str等於p 這是錯的
10/02 01:01, 18F

10/02 01:02, , 19F
int *p1=new int; int*p2; p2=p1; p2=new int;你覺得p1會
10/02 01:02, 19F

10/02 01:02, , 20F
跟著new一塊新的記憶體嘛? 顯然不會 這就類似你現在寫的
10/02 01:02, 20F

10/02 01:03, , 21F
p1是str p2是你所寫的p p去new 不代表str也跟著new了
10/02 01:03, 21F

10/02 01:15, , 22F
的確沒有被釋放 只是從頭到尾沒有被str指到
10/02 01:15, 22F

10/02 09:20, , 23F
那這樣可以在main裡free嗎?
10/02 09:20, 23F

10/02 12:06, , 24F
可以
10/02 12:06, 24F
文章代碼(AID): #1AnDCXqT (C_and_CPP)
文章代碼(AID): #1AnDCXqT (C_and_CPP)