比較難的面試題

2021-04-12 21:33:32 字數 1474 閱讀 6261

比較難的面試題 問:

如果你要為客戶寫乙個函式(軟體開發客戶),該函式用來處理乙個陣列

入口是這樣的void test(int *p)

在函式中將要對該陣列進行操作,情況有2種:

1   送入的陣列是靜態分配的

2   送入的陣列是動態分配(如malloc)的

那如何去判斷這兩種分配情況呢

wanguodu(足文字d)的答案:

不謙虛的說,我覺得我已經給出了答案。

至於說,用_msize函式,這個是vc的專利,其它弊端前面已經討論得很清楚了。用free?當它釋放非動態分配的記憶體還有棧上分配的記憶體時會丟擲異常,而且顯然不能區分靜態記憶體和棧記憶體。用彙編取得ebp和esp,藉此判斷是否是棧記憶體是可以的,但怎麼區分是靜態記憶體還是堆記憶體呢?

綜上所述,利用各編譯器處理變數和動態記憶體分配的公共策略,那就是分塊處理,是最切實可行的辦法。相信有經驗的c/c++開發人員都不會否認以下事實:

1、編譯器總是把程式中的靜態變數集中分配在記憶體的低端,一般包括data區和bss區。data區集中存放已初始化的全域性變數。bss區集中存放未初始化的全域性變數,而且bss區在可執行檔案中只存放(相對)起始位址和長度資訊以節省外存空間,只有在裝入記憶體的時候才展開並全部初始化為0;

2、執行程序的位址空間布局:不考慮環境區、命令列引數以及**區,按位址從低到高依次為靜態區(包括data區和bss區)+ 堆 + 棧。堆和棧共用程序的一大段高位址記憶體,分別用於存放程式動態分配的記憶體(比如malloc)和執行函式呼叫堆疊(其中包括當前函式的區域性變數,返回位址,一些儲存暫存器值等),但是堆的記憶體分配方式為為從低到高增長,而棧卻是從高到低增長。

有了這種分析之後,我們不難得出如下結論「因為各種記憶體,無論是靜態記憶體,動態分配的記憶體還是堆疊,它們分別都是成塊集中存放的,相互之間沒有交叉,所以對於任乙個給定的合法記憶體位址p來說,它和同類位址a1之間的距離與它和異類記憶體位址a2之間的距離相比,總有下式成立:

|p-a1| < |p-a2|.

有了這個結論,我們就可以認為設定三個分別位於靜態區、堆和棧中的變數,通過它們的位址分別與使用者傳入的位址(比如q)進行比較,其中離q最近的那個變數所在的區塊也就是q所在的區塊,以此判斷q是靜態分配的,動態分配的還是區域性陣列。具體程式我已經在前面的文章中給出,這裡稍加整理後再貼一遍以方便各位大佬閱讀:

#include

#include

#define **aller(a, b)   ((a)>(b) ? (b) : (a))

#define min(a, b, c)    **aller(**aller(a,b), c)

#define abs(x)          ((x) < 0 ? -(x) : (x))

void test(int *p)

if(s == u)

else if(s == v)

else

}int a[100] = ;                

int main(void)

java比較難面試題 一

題目二 60.執行以下程式,控制台將列印 public examtest class animal publicstring getdesc public string tostring class wolf extends animal publicstring getdesc 列印結果是 wol...

dubbo比較流行的面試題

那既然開始聊分布式系統了,自然重點先聊聊 dubbo 了,畢竟 dubbo 是目前事實上大部分公司的分布式系統的 rpc 框架標準,基於 dubbo 也可以構建一整套的微服務架構。但是需要自己大量開發。當然去年開始 spring cloud 非常火,現在大量的公司開始轉向 spring cloud ...

比較難的sql面試題 記錄下來晚上做

一組聯絡歷史 總共500萬條 id 主叫號碼 被叫號碼 通話起始時間 通話結束時間 通話時長 1 98290000 0215466546656 2007 02 01 09 49 53.000 2007 02 01 09 50 16.000 23 2 98290000 021546654666 200...