日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一道内存分配的面试题

發布時間:2023/12/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一道内存分配的面试题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是讀者在知識星球上寫的面試題

我之前寫的文章有很完整說過這部分

C語言,函數不可返回指向棧內存的指針

C 語言內存分配

堆和棧的區別(轉過無數次的文章)

看完上面的文章,我覺得你至少對C語言程序變量內存有一個概念了解了。

然后看下這幾張圖

我們想知道一個程序棧的起始地址,我們只需要寫個測試程序可以了。

#include?"stdio.h" #include?"stdlib.h"int?main(void) {int?a?=?3;int?*p?=?(int?*)malloc(sizeof(int));printf("%p\n",&a);printf("%p\n",&p);printf("%p\n",p);return?0; }

我們期望是這樣的

實際運行是這樣的,跟我們預期符合

0x7ffc3f47e1cc 0x7ffc3f47e1d0 0x562bf8677260

當然,也可以通過一些Linux 命令來查看這些信息

如果還有其他命令大家可以補充

size nm objdump

size 可以看到每個內存段的大小

weiqifa@bsp-ubuntu1804:~/c$?gcc?neicunfenpei.c?&&size?./a.outtext????data?????bss?????dec?????hex?filename1802?????616???????8????2426?????97a?./a.out weiqifa@bsp-ubuntu1804:~/c$

nm 可以看到更多的信息,包括里面的地址,還有標識符的區域,想看詳細的可以看看man nm。

#include?"stdio.h" #include?"stdlib.h"int?gint?=?1;int?main(void) {char?*?pch?=?"1231231";int?a?=?3;int?*p?=?(int?*)malloc(sizeof(int));printf("%p\n",&a);printf("%p\n",&p);printf("%p\n",p);return?0; }

查看輸出

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 下,我們修改下代碼

#include?"stdio.h"char?*?pg?=NULL;char?*?test_function(int?n) {int?a?=?3;char?*p1?=?"123";char?p2[]?=?"456";pg?=?(char?*)p2;printf("%p?%p?%p\n",&a,p1,p2);if(n?==?0)return?p1;return?pg; }int?main(void) {printf("%s\n",test_function(0));printf("%s\n",test_function(1));getchar();return?0; }

再運行

沒有段錯誤,但是第二次輸出為空!

所以,你下次面試遇到,知道怎么回答了嗎?

參考:

https://www.cnblogs.com/ittinybird/p/4657245.html


推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。

歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~

嵌入式Linux

微信掃描二維碼,關注我的公眾號

總結

以上是生活随笔為你收集整理的一道内存分配的面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。