一道内存分配的面试题
這是讀者在知識星球上寫的面試題
我之前寫的文章有很完整說過這部分
C語言,函數不可返回指向棧內存的指針
C 語言內存分配
堆和棧的區別(轉過無數次的文章)
看完上面的文章,我覺得你至少對C語言程序變量內存有一個概念了解了。
然后看下這幾張圖
我們想知道一個程序棧的起始地址,我們只需要寫個測試程序可以了。
我們期望是這樣的
實際運行是這樣的,跟我們預期符合
0x7ffc3f47e1cc 0x7ffc3f47e1d0 0x562bf8677260當然,也可以通過一些Linux 命令來查看這些信息
如果還有其他命令大家可以補充
size 可以看到每個內存段的大小
nm 可以看到更多的信息,包括里面的地址,還有標識符的區域,想看詳細的可以看看man nm。
查看輸出
weiqifa@bsp-ubuntu1804:~/c$?gcc?neicunfenpei.c?&&size?./a.outtext????data?????bss?????dec?????hex?filename1826?????620???????4????2450?????992?./a.out weiqifa@bsp-ubuntu1804:~/c$?gcc?neicunfenpei.c?&&nm?./a.out 0000000000201014?B?__bss_start 0000000000201014?b?completed.7698w?__cxa_finalize@@GLIBC_2.2.5 0000000000201000?D?__data_start 0000000000201000?W?data_start 0000000000000620?t?deregister_tm_clones 00000000000006b0?t?__do_global_dtors_aux 0000000000200db0?t?__do_global_dtors_aux_fini_array_entry 0000000000201008?D?__dso_handle 0000000000200db8?d?_DYNAMIC 0000000000201014?D?_edata 0000000000201018?B?_end 0000000000000814?T?_fini 00000000000006f0?t?frame_dummy 0000000000200da8?t?__frame_dummy_init_array_entry 0000000000000974?r?__FRAME_END__ 0000000000201010?D?gint 0000000000200fa8?d?_GLOBAL_OFFSET_TABLE_w?__gmon_start__ 0000000000000830?r?__GNU_EH_FRAME_HDR 0000000000000580?T?_init 0000000000200db0?t?__init_array_end 0000000000200da8?t?__init_array_start 0000000000000820?R?_IO_stdin_usedw?_ITM_deregisterTMCloneTablew?_ITM_registerTMCloneTable 0000000000000810?T?__libc_csu_fini 00000000000007a0?T?__libc_csu_initU?__libc_start_main@@GLIBC_2.2.5 00000000000006fa?T?mainU?malloc@@GLIBC_2.2.5U?printf@@GLIBC_2.2.5 0000000000000660?t?register_tm_clonesU?__stack_chk_fail@@GLIBC_2.4 00000000000005f0?T?_start 0000000000201018?D?__TMC_END__ojbdump 大家可以自己去看看,參數比較多
來看看我們前面說的題目
#include?"stdio.h"char?*?test_function(int?n) {int?a?=?3;char?*p1?=?"123";char?p2[]?=?"456";printf("%p?%p?%p\n",&a,p1,p2);if(n?==?0)return?p1;return?(char?*)p2; }int?main(void) {printf("%s\n",test_function(0));printf("%s\n",test_function(1));getchar();return?0; }這個代碼在gcc下是編譯會出現警告,而且運行后會出現段錯誤,因為我們訪問了一個非法內存。
weiqifa@bsp-ubuntu1804:~/c$?gcc?neicunfenpei.c?&&?./a.out neicunfenpei.c:?In?function?‘test_function’: neicunfenpei.c:11:12:?warning:?function?returns?address?of?local?variable?[-Wreturn-local-addr]return?(char?*)p2;^~~~~~~~~~ 0x7fffe549a724?0x5641eaea1874?0x7fffe549a734 123 0x7fffe549a724?0x5641eaea1874?0x7fffe549a734 Segmentation?fault?(core?dumped) weiqifa@bsp-ubuntu1804:~/c$你以為這就完了?
在devC++下,是可以正常運行的
這個dev C++?讓我覺得有點意思
所以在gcc 下,我們修改下代碼
再運行
沒有段錯誤,但是第二次輸出為空!
所以,你下次面試遇到,知道怎么回答了嗎?
參考:
https://www.cnblogs.com/ittinybird/p/4657245.html
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。
歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~
嵌入式Linux
微信掃描二維碼,關注我的公眾號
總結
以上是生活随笔為你收集整理的一道内存分配的面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kuangbin 数学训练一 Ekka
- 下一篇: U盘病毒 hypertrm.exe 修复