[問題] 關於return local pointer的問題

看板C_and_CPP作者 (stellvia)時間16年前 (2010/01/29 16:47), 編輯推噓8(8039)
留言47則, 7人參與, 最新討論串1/4 (看更多)
關於return local pointer的問題 (1) char* test() { char tmp[30]="abc"; return tmp; } int main() { printf("%s\n",test()); } 上述由於tmp是local 變數會在test function結束後記憶體空間可能就被他人佔用所以不 安全 ps.compiler 會給warning (2) char* test() { char*tmp = "abc"; return tmp; } int main() { printf("%s\n",test()); } 那這樣tmp 就不算是local 變數了嗎? 這樣是正確的嗎? ps.compiler 不會給warning (3) char* test() { char*tmp = (char*)malloc(10*sizeof(tmp)); sprintf(tmp,"%s","abc"); return tmp; } int main() { char *p_tmp; p_tmp = test(); printf("%s\n",p_tmp ); free(p_tmp) } 那再請問這個 這邊free是必要的嗎 上面malloc 是在heap中要求 memory space 而不是在stack中 所以除非我自己去 free掉記憶體 不然整支程式不論怎麼跑 我在任何的時間access p_tmp的空間都是合法的 且值是正確的? 感恩各位~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.36.18

01/29 16:53, , 1F
2還是LOCAL 3是正確的
01/29 16:53, 1F

01/29 16:56, , 2F
char*tmp = (char*)malloc(10*sizeof(tmp));
01/29 16:56, 2F

01/29 16:57, , 3F
上面這行語意有點不明0.0
01/29 16:57, 3F

01/29 17:05, , 4F
2)可能是static local, 因為位置沒有變更
01/29 17:05, 4F

01/29 17:16, , 5F
to 樓上: 2的tmp不是static, 只是普通的local變數
01/29 17:16, 5F

01/29 17:17, , 6F
所以(2)也是不能用的 可能會被其他人佔去memory空間
01/29 17:17, 6F

01/29 17:17, , 7F
只有(3)才是正確可以用的
01/29 17:17, 7F

01/29 17:17, , 8F
感恩謝謝~
01/29 17:17, 8F

01/29 17:17, , 9F
2是安全的.
01/29 17:17, 9F

01/29 17:18, , 10F
回傳"指向local變數的指標"才不安全
01/29 17:18, 10F

01/29 17:18, , 11F
對了在(3)中我後面有一段文字提到關於 access跟 free是
01/29 17:18, 11F

01/29 17:18, , 12F
正確的嗎????
01/29 17:18, 12F

01/29 17:19, , 13F
還有為什麼(2)在compiler不會給warning??
01/29 17:19, 13F

01/29 17:24, , 14F
如果是local應該是用stack儲存, 但我用了不同函式去
01/29 17:24, 14F

01/29 17:24, , 15F
哪(2)改成 char abc[10]={'a'.'b','c'};
01/29 17:24, 15F

01/29 17:24, , 16F
呼叫test(), 得到的位址都一樣
01/29 17:24, 16F

01/29 17:24, , 17F
char *tmp = abc;
01/29 17:24, 17F

01/29 17:25, , 18F
return tmp;
01/29 17:25, 18F

01/29 17:25, , 19F
但就以原來的(2)而言tmp 不是local 變數嗎為什麼合法
01/29 17:25, 19F

01/29 17:29, , 20F
回傳local變數一直都是合法的
01/29 17:29, 20F

01/29 17:30, , 21F
int f(){int x=0; return x;} 這x也是local變數喔
01/29 17:30, 21F

01/29 17:31, , 22F
我是說回傳local pointer 之後去access pointer所指向
01/29 17:31, 22F

01/29 17:31, , 23F
的地方是會有問題得 值會不正確?
01/29 17:31, 23F

01/29 17:32, , 24F
原來我們講的東西不一樣
01/29 17:32, 24F

01/29 17:33, , 25F
=.=+
01/29 17:33, 25F

01/29 17:34, , 26F
所以說問題在你pointer指向的東西是不是local
01/29 17:34, 26F

01/29 17:35, , 27F
char tmp[]="abc"; 這個abc在stack裡面
01/29 17:35, 27F

01/29 17:36, , 28F
char* tmp="abc"; 這個abc在遙遠的外太空 不會被消滅
01/29 17:36, 28F

01/29 17:37, , 29F
為什麼他是在遙遠的外太空?
01/29 17:37, 29F

01/29 17:38, , 30F
他不也是在stack中?
01/29 17:38, 30F

01/29 17:38, , 31F
同樓上
01/29 17:38, 31F

01/29 17:39, , 32F
他可能是static local 或是 global, 隨著程式消長
01/29 17:39, 32F

01/29 17:40, , 33F
沒有為什麼啊 c語言的設計就是這樣
01/29 17:40, 33F

01/29 17:40, , 34F
就是這裡 為什麼他會變成 static local? or global?
01/29 17:40, 34F

01/29 17:41, , 35F
tmp也是在 test function 內部new出來的怎麼會變成不是
01/29 17:41, 35F

01/29 17:41, , 36F
在stack中
01/29 17:41, 36F

01/29 17:43, , 37F
malloc出來的記憶體是在heap中, 區域變數在stack裡
01/29 17:43, 37F

01/29 17:44, , 38F
new出來的都會在heap區
01/29 17:44, 38F

01/29 17:44, , 39F
但有些敘述實際上需要記憶體, 編譯器會自動幫你要
01/29 17:44, 39F

01/29 17:45, , 40F
自動要的記憶體分佈就不太一定了
01/29 17:45, 40F

01/29 17:47, , 41F
所以是compiler自動去要記憶體空間 所以access tmp所指
01/29 17:47, 41F

01/29 17:47, , 42F
向的值 才不會有錯?
01/29 17:47, 42F

01/29 18:37, , 43F
不敢保證⊙⊙
01/29 18:37, 43F

01/30 02:06, , 44F
推在遙遠的外太空XD AstralBrain大說的是對的, 小弟回
01/30 02:06, 44F

01/30 02:07, , 45F
01/30 02:07, 45F

01/30 08:44, , 46F
關於(3):有借有還,再借不難.
01/30 08:44, 46F

04/30 22:16, , 47F
有看有推
04/30 22:16, 47F
文章代碼(AID): #1BOg2AP0 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BOg2AP0 (C_and_CPP)