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

作者: Kuba4ma (哦吼)   2022-03-24 23:10:14
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不會消失
謝謝大家
作者: Schottky (順風相送)   2022-03-25 00:19:00
置底十三誡之第五誡
作者: breeze08 (linuxer)   2022-03-25 00:23:00
第一段是把p內的值回傳,然後p這個變數本身的空間(stack)被釋放,而p回傳值所指向的空間(heap)仍然存在
作者: ctrlbreak   2022-03-25 06:39:00
所以我都建議先學組語XD
作者: Kuba4ma (哦吼)   2022-03-25 09:04:00
我理解了 謝謝各位大神
作者: Dracarys (MayShowGunMore)   2022-03-25 09:54:00
第一個p指向dynamically allocated的空間,第二段指向stack上的array。你應該是寫C吧?那malloc就不用轉型。https://godbolt.org/z/cbT74jcz6Clang會乖乖回傳local variable的位址,gcc直接回傳0。UB的情況code隨便compiler生
作者: yesiah   2022-03-25 11:25:00
先讀一下memory layout,弄懂什麼東西在stack什麼在heap
作者: CoNsTaR ((const *))   2022-03-29 06:39:00
C string literal 其實有和主程式一樣的 lifetime所以 `p[]` 改 `*p` 或是直接回傳 `"hello world"` 就可以了
作者: F04E (Fujitsu)   2022-03-29 08:57:00
.....

Links booklink

Contact Us: admin [ a t ] ucptt.com