申請1G的空間 是否覺得題目越簡單越難做呢

2021-06-28 03:10:07 字數 2642 閱讀 5928

曾經碰到過的乙個面試題,說,寫**申請1g的空間吧!

方法1:直接定義

char  *buffer[1024*1024*1024];

解析:這就是乙個1g的空間了,可是問題是,這種申請方式是在棧區開闢的,棧區往往沒有那麼大,比如linux中可使用 ulimit -s 檢視棧區的限制大小,單位是kb,預設是8mb或者10mb的樣子。所以這種方式的申請方法在不改 ulimit -s 的值的情況下,程式在初始化包含定義這個變數的函式的時候就會死掉,也就是段錯誤,原因是,棧區由系統管理的,系統將包含該定義的子函式放入棧區的時候,由於棧空間不足就掛掉了。修改棧大小的方法是 ulimit -s 1049600。也就是改棧區大小為1g零1m,當然應該再大一點,不能剛剛好(程式執行過程中不單單裝著乙個變數,還有其他東東)。

結果:

修改ulimit -s 之前

編譯:通過

執行:段錯誤

修改ulimit -s 之後

編譯:通過

執行:通過

擴充套件:

1)修改大小為1024*1024*1024*2

編譯:不通過

報警告:integer overflow in expression  整型溢位

報錯誤:overflow in constant expression 常量表示式溢位

報錯誤:size of array is negative       陣列大小為負值

原因分析:int的最大值是2^32-1,1024*1024*1024*2剛好越界,也就是 -2147483648,剛好解釋第二個陣列大小不能為負的報錯, 是否在想給這個值減一就可以了呢,其實還是編譯報錯--常量表示式溢位,畢竟乘法優先順序高,計算過程中會產生溢位,也就報錯了,即使,1024*1024*1024*2溢位後是 -2147483648,減一變為 2147483647 最終值合法,可是那麼一瞬間溢位了,編譯不通過了。

2)修改大小為1024*1024*1024*4

編譯:不通過

報警告:

integer overflow in expression  整型溢位

報錯誤:overflow in constant expression 常量表示式溢位

報錯誤:overflow in array dimension     陣列維數溢位

原因解析

:此處發現有乙個不同的錯誤,陣列維數溢位,經過以%ld和%d的方式列印出該值,發現其實是0,那麼考慮是不能定義大小為0的陣列,其實可以定義。該錯誤原因尚不明確,但是當把1024*1024*1024*4 改為 1024*1024*1024*4l (末尾加l,含義是long型別)程式編譯可通過了,執行段錯誤是因為棧小了唄,ulimit改之,編譯執行都通過,於是會發現,該方法申請的空間受ulimit -s限制的同時,long型別的大小都支援了(long八字節,2^64-1),還有多大空間不能申請呢。

chu

結論:顯然,沒有問題的方式!但是棧區還是很有限的,在不知道修改ulimit的情況下,編譯通過,執行段錯誤是不是會懵了呢,相比找原因得找半天才對。

方法2:malloc堆區開闢

char *buffer;

buffer = (char *)malloc(1024*1024*1024);

if ( null == buffer )

fprintf(stderr,"malloc fail. errno[%d],errmsg[%s]\n",errno,strerror(errno));

else 

fprintf(stdout,"malloc ok\n");

解析:這種方式,編譯執行,一路無誤

擴充套件:1)如果將大小改為1024*1024*1024*2,

編譯:通過

報警告:integer overflow in expression 整型溢位

執行出失敗:malloc fail. errno[12],errmsg[cannot allocate memory]

原因分析malloc接受的引數是size_t,size_t是標準c庫中定義的,應為unsigned int,在64位系統中為 long unsigned int,我測試環境是64位linux,所以改為1024*1024*1024*2l 多加乙個l,代表是long型別,編譯無警告,執行可通過

2)如果大小改為1024*1024*1024*2-1,

編譯:通過

報警告:integer overflow in expression 整型溢位

執行:通過

原因分析1024*1024*1024*2剛好溢位int,最終值便是int的最小值 -2147483648 ,減一後變為int的最大值 2147483647,於是是malloc可用的合法值,所以malloc成功,之所以有警告應該是因為乘法的優先順序高,在那麼一瞬間真的發生了溢位。

結論:就應該malloc申請,但是不能忘了free,同時申請空間大於等於2g時別忘了加l,因為預設的常量值是int型

方法

三、定義結構體然後new

1)定義結構體,或者說定義類

2)用new生成物件,

3)別忘了free

4)真的怕忘了free,那就用智慧型指標,shared_ptr

5)智慧型指標的好處在於不用free,系統會自動**,具體請看其他文章。如:

免費虛擬主機1G空間5G流量

今天給大家介紹下leadhoster免費主機,這家主機申請完畢才看起來好像是乙個免費的分銷提供的,所以簡要的跟大家介紹一下,具體的哪個地區的主機也木有看清楚,畢竟這麼小的主機做一般的 都不夠,差不多只能做個沒流量的展示頁面使用,不過leadhoster使用的php版本和mysql都是非常新的。如果你...

1G 小a的排列(C )

點選做題 鏈結 題目描述 小a有乙個長度為n的排列。定義一段區間是 萌 的,當且僅當把區間中各個數排序後相鄰元素的差為1現在他想知道包含數x,y的長度最小的 萌 區間的左右端點 也就是說,我們需要找到長度最小的區間 l,r 滿足區間 l,r 是 萌 的,且同時包含數x和數y 如果有多個合法的區間,輸...

阿里雲1核1G的意思

阿里雲1核1g什麼意思?這句話的意思是阿里雲1核cpu,1g記憶體配置機型。鑑於能問出這個問題的一定是新手,所以老魏就簡單介紹一下阿里雲1核1g記憶體的機型及如何選擇。2 阿里雲1核1g記憶體的伺服器,常用的熱門型別有以下幾種 1 核 1g 25g ssd雲盤 1 核 1g 40g 高效雲盤 1 核...