『壹』 c語言編譯,如何減少內存
用時再申請內存,用完了就放掉,要考慮到變數的生命周期,在合適的位置聲明變數
『貳』 用c語言怎樣無限開辟內存、或編一個通過無限開辟內存,處理大量數據的程序來讓電腦死機。
生成大鏈表,最好裡面用大節點,這樣可以加速內存的耗盡,分配時用calloc申請內存,malloc也可以,生成中的節點中多用指針,然後指針不指空值(這樣就有可能指到系統區去),這里的用三個do{}while(1)來實現,一個是生成鏈表,一個是用鏈表節點值做任意的運算——這兩個是同一等級的,還有一個是最外層。這里一定是要用到break的……思路是這樣的,你也是這樣想的吧,想必我說的就是你想的,只是你在編譯是總是不得過,對啊,呵呵,別傻啦,我們能找到的編譯器是要做安全性檢查的(不光是一些語法的)
除非,你在寫之前,自己先寫一個編譯器來……或者你已經找到了這樣的工具
『叄』 請問在C語言編程時,怎樣才能更加合理的分配和使用內存
那應該是你在堆上分配的空間(就是用new或malloc之類分配的空間)沒有收回,而造成內存泄漏了吧!程序運行的時間長了就把內存給泄漏光了。。。(可能性最大)
要不就是棧空間被你用完了?~~~比如在棧上分配了很大的數組之類的,造成棧溢出什麼的。(這也有可能)
再或者,你頻繁的在堆上分配和釋放空間,最終造成內存碎片,而無法分配到你所要求的整塊空間了。(這種可能最小。。。特別是現在的操作系統內存管理都很優秀的,除非你是在嵌入式系統中運行的)
『肆』 怎樣編寫C語言代碼使運行內存更小
方法多了:
1、盡量少用系統函數;
2、不要多定義變數;
3、使用合適類型的變數;
4、減少代碼;
5、使用小模式編譯;
等等
『伍』 用C語言分配開辟內存問題
你的代碼不是C的,其實現在語言比較強大,也許在內存回收上做了完善,我不會C++,我知道JAVA語言,他本身在內存回收上面做了優化,就是在堆中申請的內存,操作系統沒回收,但JAVA語言最終編譯成可運行碼的時候,回收了這塊內存(JAVA的垃圾回收機制,蠻強的,不過我不太喜歡)。你可以試試用C寫,用malloc 來申請,這個應該不會被回收的,你可以試試,當然可能和其它原因有關。
最後如果你想學習內存管理的話,方向是:操作系統理論中的頁式內存管理,地址的印射這2部分是理論(比較簡單,實際情況比這復雜一點,先看理論比較好)
等真的明白了(應該不難懂),下面就有難度了,選一個比較流行的CPU的地址映射(各種不同的CPU地址映射是不一樣的),我看的是intel 80386後出現的保護模式(其實是286後出現的,不過286沒什麼名氣),以及linux中內存管理的源代碼(記得結合書看,直接看代碼很難懂)。
==========================================
你的問題算是有點難度和深度的。
關於內存開辟問題,在linux中有個很特殊的內存段,它的大小是8K,我們叫他系統堆棧空間,任何一段程序代碼在運行時候它都是一個進程,它都會有這么一個8K的系統堆棧空間。局部變數都是放在這樣一個8K空間中,包括int a,int a[100], int *a.他們都放在這里。
那麼第一個問題就回答了,int a就是放在系統堆棧空間中。當這個進程死亡的時候,會有其它的進程來回收這個空間(它自己會指定的,一般是其父進程),所以你不需要自己手動去釋放局部變數佔地內存。
至於int * a;然後你new一個空間這個就有點不同了,首先 * a還是個局部變數,他是存在於系統堆棧中。不過它存的比較特殊是一個邏輯地址,不是一個值(其實邏輯地址也就是一個無符號的16位整數而已)。當你new 的時候,會在堆空間中開一個空間,並把這個空間的地址放到剛那個 a中去。很明顯新申請的空間不是在系統堆棧空間中,父進程(一般是)是不會回收這個內存的,這就是為什麼你要自己 free(a) 這樣來釋放空間。
我們常說局部變數不要過大,比如int a[10000]這是不允許的,可以看出來只有8K的大小的內存,而且他還不全部都是給局部變數使用,他有相當一部分內存是給進程式控制制塊和中斷返回現場用的(讀過linux源代碼你就清楚了),另外C語言不檢查數組邊界,如果你int a[4]數組,而不顧一切的向這個數組上放東西,你就有可能很運氣的把中斷的返回地址給沖掉,聰明的人會放一個新的返回地址進去,而這個地址返回一個惡意的進程。知道會發生什麼了,這就是緩沖區溢出攻擊。
windows雖然不太一樣,但原理差不多。
『陸』 C語言各種數據在內存中的分配方式,分別對程序的運行效率有哪些影響
內存分配?
堆棧的綜合效率最高(除寄存器外),一般函數(包括main())的變數都是在堆棧內的。
你可以顯示聲明register 但是是存在寄存器還是一般的堆棧完全由編譯器決定優化,其實你加了也沒用。。。。。堆棧是在內存的一塊固定大小的區域,比較小,數據量大了會爆棧(綜合最高是因為會有部分內容進入寄存器,寄存器比內存快)。
全局變數是在全局變數區的,全局變數區是在內存中的固定大小的一塊區域。全局變數區也不怎麼大,但是比堆棧大多了。。。。
函數代碼區。。。是在內存 你無視好了。。。
堆區 是在內存的一塊很大很大的區域,一切動態建立的對象(c用alloc家族函數 c++的new)都是在堆區,一般堆區是不會爆的,除非真的很大大大大大。。
效率上講 寄存器最快,然後就是內存了,磁碟的讀寫不考慮。
綜上,編譯器會幫你優化的,你只要關心會不會爆棧,會不會爆全局變數,就行了。。
還有字元串常量區,也是在內存中的,你也無視好了。。。。。
還有靜態區也是在內存中的,大小是編譯器編譯時決定的,你也無視好了。。。。
『柒』 c語言程序運行時 內存問題
以程序的具體執行過程為例來給你講解,但願你能理解:
1.程序被打開時,即程序開始運行時,會首先向操作系統請求獨占內存空間(一段在程序整個執行過程中都不釋放的空間),操作系統會應答請求並分配一段邏輯上連續(其實是將零散的內存空間映射為一段連續的空間)的內存空間給該程序,此時程序得到該段空間的邏輯地址信息,根據地址將程序代碼段和數據段裝入內存,此時程序載入完成。
2.程序運行中,當某一過程任務需要更大內存空間時,會再次向操作系統發出請求,操作系統會根據請求再次分配內存空間給該程序,當這一過程任務執行完畢後,該內存空間被釋放。同時由於操作系統的存儲保護,程序在運行過程中只能訪問自己所申請的內存空間,不能訪問其他程序的內存空間。
3.當程序執行完畢或關閉程序後,該程序所佔的所有內存空間都被釋放。
當你再次打開程序後,重復上面的過程。
下面對你的問題進行針對性回答:
1.當程序運行時,會調入內存,不同時間運行,程序放在內存的位置也可能不同:每運行一次程序,程序都會重新向操作系統申請內存空間,這時操作系統會分配一段全新的內存空間給程序,故不同時間運行程序,程序在內存中的位置是不同的。
2.使用內存中數據的位置也可能不同:當程序申請內存空間後,操作系統會將所申請的內存空間的地址傳給程序,盡管數據的位置不同,但程序知道數據的地址,故程序依然可以根據地址來找到所需要的數據。
『捌』 c語言怎樣優化代碼減少佔用ram
別用吃內存多的演算法就省內存了
能把問題詳細說一下么
『玖』 關於C語言動態分配內存的問題
要實現動態內存的分配,除了利用含指針成員的結構體之外,還需利用C語言提供的幾個標准庫函數。(使用時應包含頭文件「alloc.h」或「malloc.h」或「stdlib.h」)
1.malloc函數
函數原型為void *malloc(unsigned int size);在內存的動態存儲區中分配一塊長度為"size" 位元組的連續區域。函數的返回值為該區域的首地址。 「類型說明符」表示把該區域用於何種數據類型。(類型說明符*)表示把返回值強制轉換為該類型指針。「size」是一個無符號數。例如: pc=(char *) malloc (100); 表示分配100個位元組的內存空間,並強制轉換為字元數組類型,函數的返回值為指向該字元數組的指針, 把該指針賦予指針變數pc。若size超出可用空間,則返回空指針值NULL。
2.calloc 函數
函數原型為void *calloc(unsigned int num, unsigned int size)
按所給數據個數和每個數據所佔位元組數開辟存儲空間。其中num為數據個數,size為每個數據所佔位元組數,故開辟的總位元組數為 num*size。函數返回該存儲區的起始地址。calloc函數與malloc 函數的區別僅在於一次可以分配n塊區域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu類型,並把其首地址賦予指針變數ps。
3. realloc函數:
函數原型為void *realloc(void *ptr, unsigned int size)
重新定義所開辟內存空間的大小。其中ptr所指的內存空間是用前述函數已開辟的,size為新的空間大小,其值可比原來大或小。函數返回新存儲區的起始地 址(該地址可能與以前的地址不同)。例如p1=(float *)realloc(p1,16);將原先開辟的8個位元組調整為16個位元組。
**動態申請的內存空間要進行手動用free()函數釋放
例子:
char *p;
p=(char*)malloc(8);//開辟8個位元組的存儲空間,並把地址賦給指針p,通過指針p對該空間進行存取操作。
*p='L'; //存儲字元,所分配空間的第0位元組存儲L
*(p+1)='o';//分配空間的第一位元組存儲字元'o'.
*(p+2)='v';
*(p+3)='e';
*(p+4)='\0';
puts(p);//輸出字元串
free(p);//釋放空間
注意:*(p+n)等價於p[n],(p+n)是地址,而*(p+n)就是取地址(p+n)的內容。
如上面程序中的*(p+1)='A';可寫成p[1]='A';
malloc()函數的參數可以是常數、變數或表達式等。除了存放字元串外,malloc()也可取得空間來存儲整數等數據。例如存儲整數分配空間如下:
int *ptr;
ptr=(int *)malloc(sizeof(int)*4);
malloc()開辟空間存儲4個整數數據,由於malloc()總傳回第0位元組的地址,且返回值必定是char*類型,所以要通過(int *)來強制轉換為指向整型後存入指向整型的指針ptr.
當用malloc()函數分配空間時,若計算機無法提供足夠的空間分配則會返回NULL指針。所以,若返回的指針為NULL,就表示可分配的剩餘空間已不足。
『拾』 c語言內存問題
答案是C
p1是存儲在棧區
p2這個指針是存儲在堆區的,因為p2是malloc分配的空間
"123456"是一個常量,所以它是存儲在常量區的,並不是存儲在棧區
棧區和堆區方向是相反的,一個向下增長,一個向上遞減。