[問題] 記憶體位址回傳問題

看板C_and_CPP (C/C++)作者時間2年前 (2022/03/24 23:10), 2年前編輯推噓3(4110)
留言15則, 8人參與, 2年前最新討論串1/1
1. char* GetMemory() { char* p = (char *)malloc(100); return p; } void test() { char *str = NULL; str = GetMemory(); strcpy(str, "hello world"); printf("%s\n", str); } int main(){ test(); } 2. char* GetMemory() { char p[] = "hello world"; return p; } void test() { char *str = NULL; str = GetMemory(); printf(str); } int main(){ test(); } 第一段的code會印出"hello world" 但是第二段不會 我的問題是 第二段code的GetMemory內做陣列宣告 不也是會配置記憶體給 p 嗎? 那麼做的事情和第一段code的GetMemory一樣 為什麼不會印出"hello world" 如果第二段code的p會因為function結束而不見的話 為什麼第一段code的p不會消失 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.26.139 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1648134616.A.EFF.html ※ 編輯: Kuba4ma (111.251.26.139 臺灣), 03/24/2022 23:15:19

03/25 00:19, 2年前 , 1F
置底十三誡之第五誡
03/25 00:19, 1F

03/25 00:23, 2年前 , 2F
第一段是把p內的值回傳,然後p這個變數本身的空間(stac
03/25 00:23, 2F

03/25 00:23, 2年前 , 3F
k)被釋放,而p回傳值所指向的空間(heap)仍然存在
03/25 00:23, 3F

03/25 06:39, 2年前 , 4F
所以我都建議先學組語XD
03/25 06:39, 4F

03/25 09:04, 2年前 , 5F
我理解了 謝謝各位大神
03/25 09:04, 5F

03/25 09:54, 2年前 , 6F
第一個p指向dynamically allocated的空間,第二段指向s
03/25 09:54, 6F

03/25 09:54, 2年前 , 7F
tack上的array。你應該是寫C吧?那malloc就不用轉型。
03/25 09:54, 7F

03/25 09:59, 2年前 , 8F

03/25 10:04, 2年前 , 9F
Clang會乖乖回傳local variable的位址,gcc直接回傳0。
03/25 10:04, 9F

03/25 10:04, 2年前 , 10F
UB的情況code隨便compiler生
03/25 10:04, 10F

03/25 11:25, 2年前 , 11F
先讀一下memory layout,弄懂什麼東西在stack什麼在heap
03/25 11:25, 11F

03/29 06:39, 2年前 , 12F
C string literal 其實有和主程式一樣的 lifetime
03/29 06:39, 12F

03/29 06:39, 2年前 , 13F
所以 `p[]` 改 `*p` 或是直接回傳 `"hello world"` 就可
03/29 06:39, 13F

03/29 06:39, 2年前 , 14F
以了
03/29 06:39, 14F

03/29 08:57, 2年前 , 15F
.....
03/29 08:57, 15F
文章代碼(AID): #1YF8dOx_ (C_and_CPP)
文章代碼(AID): #1YF8dOx_ (C_and_CPP)