[問題] 關於function中malloc問題

看板C_and_CPP作者 (杰克)時間13年前 (2012/02/08 18:05), 編輯推噓7(7032)
留言39則, 13人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) DEV C 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 在我的strcpy中,我選擇在function中使用malloc配置記憶體,如此情況下 程式會出錯,但如果我是在main中使用malloc,則程式可以正常的執行my_strcpy, 還請各位版友告訴我問題在哪裡。 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> #include <string.h> char* my_strcpy(char* dst, const char* src) { dst=malloc(sizeof(char)*10); //malloc in function char* ret= dst; while(*ret++ = *src++); return ret; } void my_str_print(char * my_string) { int i; for( i=0; i<strlen(my_string); i++) { printf("%c",my_string[i]); } } int main () { char str1[]="abcde"; //char* str2=malloc(sizeof(char)*10); //malloc in main char* str2; printf("the address:%X\n",str2); my_strcpy(str2,str1); my_str_print(str2); system("PAUSE"); free(str2); return 0; } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.27.29

02/09 03:09, , 1F
十三誡第三點
02/09 03:09, 1F

02/09 08:17, , 2F
02/09 08:17, 2F

02/09 09:56, , 3F
str2 = my_strcpy(str2,str1);
02/09 09:56, 3F

02/09 11:23, , 4F
另外十三誡第十三點也看一下
02/09 11:23, 4F

02/09 11:51, , 5F
char* my_strcpy(char* dst, const char* src) 改成
02/09 11:51, 5F

02/09 11:51, , 6F
char* my_strcpy(char*& dst, const char* src)
02/09 11:51, 6F

02/09 11:53, , 7F
實際上,這樣做是可以達到其它 code 不動,但可能會產成
02/09 11:53, 7F

02/09 11:54, , 8F
邊際效應,使用上需要注意。
02/09 11:54, 8F

02/09 12:07, , 9F
我覺得 *& 看起來比 ** 還要恐怖... (個人偏見 XD)
02/09 12:07, 9F

02/09 12:25, , 10F
+1
02/09 12:25, 10F

02/09 13:13, , 11F
我只是針對他所需求給一個可以完成的做法,所以最後有提到
02/09 13:13, 11F

02/09 13:14, , 12F
使用的時候會有邊際效應,因為沒注意的話,怎麼掛掉的都不
02/09 13:14, 12F

02/09 13:14, , 13F
知道(飛逃)
02/09 13:14, 13F

02/09 13:16, , 14F
畢竟同一個需求,達成的方法不只一種。我也不會認為我提供
02/09 13:16, 14F

02/09 13:17, , 15F
的就是最佳解(倒)
02/09 13:17, 15F

02/09 13:37, , 16F
其實我當年使用csihcs的方法,可是後來改成james732
02/09 13:37, 16F

02/09 15:12, , 17F
我猜想應該是一般使用function call多數是以pass-by-value
02/09 15:12, 17F

02/09 15:13, , 18F
所以使用 char**,會讓自己明確記得已經會改到caller傳來的
02/09 15:13, 18F

02/09 15:15, , 19F
資料,然而用 char*& 則有時候會以為自己改的是local變數
02/09 15:15, 19F

02/09 15:16, , 20F
導致之後在比較長的code中,要debug是一個很不容易抓到的。
02/09 15:16, 20F

02/09 16:00, , 21F
別想太多,單純就是純c一定要用char**.然後char* &很怪
02/09 16:00, 21F

02/09 16:26, , 22F
那個&不是reference嗎?在c不能用吧
02/09 16:26, 22F

02/09 17:13, , 23F
你需要兩顆星來解決.....
02/09 17:13, 23F

02/09 17:57, , 24F
只有我覺得他 my_strcpy 的 return 值怪怪的嗎 Q_Q
02/09 17:57, 24F

02/09 17:59, , 25F
那個return值看起來沒問題啊?
02/09 17:59, 25F

02/09 18:37, , 26F
my_strcpy return 沒問題+1
02/09 18:37, 26F

02/09 19:46, , 27F
沒問題+1
02/09 19:46, 27F

02/09 20:51, , 28F
@_@ 正常 strcpy 不是 return dst 嗎...
02/09 20:51, 28F

02/09 21:08, , 29F
這有差別嗎?
02/09 21:08, 29F

02/09 22:17, , 30F
ret=dst不就都一樣了,不過問題不在這邊就是了.
02/09 22:17, 30F

02/10 01:19, , 31F
不過後來看看,main的地方 str2 = my_strcpy(null,src)
02/10 01:19, 31F

02/10 01:20, , 32F
其實就好了,其它一樣不用改,不過等於說dst這個parameter
02/10 01:20, 32F

02/10 01:20, , 33F
是個沒用的參數(倒)
02/10 01:20, 33F

02/10 09:05, , 34F

02/10 10:12, , 35F
ret 最後的值就不是 dst, 所以 str2 = my_strcpy 是錯的
02/10 10:12, 35F

02/10 10:13, , 36F
ret++ 是加辛酸的 ? 是我誤會了嗎.. Orz
02/10 10:13, 36F

02/10 10:16, , 37F
咦,樓上說的有道理,我沒發現ret會往前跑 XD
02/10 10:16, 37F

02/10 10:42, , 38F
其實那是STL copy風格, return結尾的iter (大誤)
02/10 10:42, 38F

02/10 22:58, , 39F
對耶~~~被拐到了@@"
02/10 22:58, 39F
文章代碼(AID): #1FChbce0 (C_and_CPP)