為什麼c 程式中 define max 5000000 太大不能執行?

時間 2021-05-31 00:35:46

1樓:天天向上

main()函式使用的是棧空間,大小好像為1M左右,new方法分配的是堆空間,在記憶體中,可以分到G以上的記憶體空間。建議你去看看c++的記憶體管理機制。

2樓:張羽戈

全域性變數還有new出來的陣列都是建立在堆上的,堆的最大大小與系統記憶體有關,而函式裡直接分配也是在棧上的,windows下的棧可能系統允許的很小,於是開不下。

3樓:

乙個程式四個segment(以前也有說3個的), code, stack, heap, data. static的放在了data裡(你在函式外申明也應該是在data裡),new的放在了heap裡,直接寫的放在了stack上。stack本身不會太大,如果你知道runtime stack怎麼回事也就知道往stack上堆太多東西的風險以及影響效率。

4樓:

當年我還是乙個青蔥少年,在寫了1年多C++程式之後,讀了《C++ Primer》,自覺功力大進,睥睨程式,頗為自得。領悟了,(裸)指標這玩意兒能不用就不用等種種道理。因此到哪兒都是開陣列。

有一日開了乙個2M位元組的陣列,跟題主一樣,跑到這一行程式立刻崩潰。百思不得騎姐。遍查網路得到乙個棧溢位的解釋,方知天外有天,C++萬里長征,才第一步呢。

5樓:子非魚

linux下沒問題

回覆 Mio Yuan :linux使用者空間棧在發生缺頁中斷時可以自動擴充套件的。棧大小只受物理記憶體限制

6樓:Coldwings

這裡存在乙個堆(heap)空間與棧(stack)空間的問題。嚴格說這是OS管理的範疇。

stack是程式準備執行時,OS分配給它的一片連續記憶體區域。stack在執行期總大小不變,對於C/C++在編譯時就會指定申請的棧空間大小,一般都不會很大,並且系統也不允許棧空間太大,因為棧空間必須要連續一整塊,申請不到則這個程序不可啟動。

堆空間則是OS管理記憶體的公共區域,空間申請都在執行期,申請不到最多拋個異常(C裡直接返回個null),空間很大,而且不必要以執行緒為單位連續,自然可以開更大的陣列。

另外以我多年的ACM/OI經驗來看,一般題目用棧空間都不會有太大問題,換句話說就是沒必要非要開那麼大個陣列。如果實在不夠用,大部分情況是你的方法錯了或者有明顯優化你沒用到……

7樓:莫濤

結論:任何函式裡面不要開大陣列。

原因:寫在main()外面的變數叫做全域性變數,分配在靜態資料區。

new出來的變數叫動態變數,分配在堆上。

函式裡面的變數叫區域性變數,分配在棧上。

前兩者基本只受你的記憶體大小影響,想開多大開多大。

棧空間是和作業系統以及編譯器有關的,你用的DevCpp和Windows,那這個限制應該是4MB(如果沒有記錯的話),int[5000000]需要的空間是19MB,所以就放不下(俗稱爆棧),從而就執行錯誤了。

當然,如果你硬是想把這個陣列放在函式裡面,可以通過調整編譯選項來達到。

點DevCpp上面的'compiler option', 把這段話貼到'add these commands to compiler'的那個框裡:

-Wl,--stack,100000000

C語言可以寫多少個程式,為什麼?

Parsea 答案 如果不考慮現實物理意義上的儲存空間,則為可數無限個,和自然數集的基數是等勢的 否則是有限的。原因 我們設長度為n的C語言程式 包括標頭檔案等 的個數為f n 那麼顯然,對於任意的自然數n,f n 是有限的,因為它最大為x的n次方 x為合法的C語言字符集基數 對於其中能夠編譯通過的...

為什麼科學計算程式用c 寫的極少

gang chen C 是物件導向的語言,搞個小東西用C 略顯重量級,有點麻煩 很演算法庫在其他語言上已經實現,C 開源太晚,演算法庫不夠完善,有些用C 時需要重新造輪子,白piao還是很爽的,重新造輪子代價太高,與我等拿來主義的價值觀不符 國內大公司風向問題歧視鏈 白友利 工業軟體好多用的啊。很多...

C 中為什麼要有allocator類?

Wu Jarvis 我是這麼理解的 其實你只要分清vector中resize,reserve的關係就能明白了,resize時,當元素數量 capacity時不但會分配空間,而且會初始化元素 reserve只會做分配空間的事情,不會做初始化,這樣就把分配空間和初始化的事情分開來了,如果不分開的話,那麼...