PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] 記憶體位址回傳問題
作者:
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/cbT74jcz6
Clang會乖乖回傳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
.....
繼續閱讀
[閒聊] 送書C++ Primer 4/e中文版
cyutdt
Re: [問題] 關於fflush的使用時機
descent
[問題] 請教一個 thread 和 queue 的問題
Shuhaur
[閒聊] C++ 支援相依型別的話會長怎樣?
CoNsTaR
[問題] 寫後端適合QT框架嗎?
Isaea
[問題] 為什麼會印兩次child
abcd991276
[問題]關於YOLOv4檢測結果座標和和準確率原始碼
bbcc11598
Re: [問題] 二維陣列指標表示方法
Dracarys
[問題] 二維陣列指標表示方法
lllll12b56
[問題] is_nothrow_move_constructible 相關問題
alan23273850
Links
booklink
Contact Us: admin [ a t ] ucptt.com