當前位置:首頁 » 編程語言 » c語言內存優化

c語言內存優化

發布時間: 2023-04-22 09:02:06

『壹』 用c語言怎樣無限開辟內存、或編一個通過無限開辟內存,處理大量數據的程序來讓電腦死機。

生成大鏈表,最好裡面用大節點,這樣可以加速內存的耗盡,分配時用calloc申請內存,malloc也可以,生成中的節點中多用凱歲指針,然後指針不指空值(這樣就有可能指到系統區去),這里的用三個do{}while(1)來實現顫喊,一個是生成鏈表,一個是用鏈表節點值做任意的運算——這兩個是同一等級的,還有一個是最外層。這里一定是要用到break的……思路是這樣的,你也是這樣想的吧,想必我說的就是你想的,只是你在編譯是總是不得過,對啊,呵呵,別傻啦,我們能找到的編譯器是要做安全性檢查的(不光是一些語法的)
除非,你在寫之前,自己先寫一個編譯器來……或者你茄孫野已經找到了這樣的工具

『貳』 求教C語言內存過剩的解決辦法!!

首先我想說一下new和delete不是C語言裡面的東西,那是C++裡面的。還有就是for(int
i=0;i<a;i++)這段代碼也不是C語言的,這個是C++的,C語言的應該是

int
i;

for(i=0;
i<a;
i++)

現在給您講一下動態分配方法,代碼如下

#include
<stdio.h>
#include
<stdlib.h>

void
main()
{
int
a,
sum=0;
printf("蠢配請輸入學科數目:");
scanf("%d",
&a);
int*
b
=
(int*)malloc(a*sizeof(int));
//動態分配內存空間

printf("請輸入學科數目:");
int
i;
for(i=0;
i<a;
i++)
{
scanf("%d",
&b[i]);
sum
+=
b[i];
}
printf("該學生總成績:%d\n",
sum);
free(b);
//釋放分配的內存空間

}

解釋:malloc函數用於分配內存空間,在這里您輸入的為a個學科,所以要用到a個整數用來存儲各科成績,而每一個整數佔用內存為sizeof(int),總共有a個整數猛散,所以分配a*sizeof(int)個位元組的空間,程序運帶知指行完畢之後需要釋放分配的內存空間,用free()函數釋放,否則程序退出會造成內存泄露。

謝謝採納。

『叄』 C語言編譯,如何減少內存

用時再申請內存,用完了就放掉,要考慮到變數的生命周期,在合適的位置聲明變數

『肆』 用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語言釋放內存的問題

釋放空間是指用「動態申請內存函數」申請成功的空間,不是你寫的代碼佔用的空間。你寫的代碼的可執行文件佔用的空間要等程序完全退出後才能自動釋放,動態申請的空間在使用完畢後可以用對應的「釋放函數」釋放,以防止所謂「內存泄漏」——就是把內存空間用完了,程序無法運行下去了。如果只申請不釋放,積累多了就會產生內存泄漏問題;在空間申請得較少的情況下也不至於一定產生泄漏,等程序退出時也就自動釋放了。但寫合格的程序是不能有這種指望的,正確的做法是「申請——成功後使用——使用完後及時釋放。

『陸』 C語言各種數據在內存中的分配方式,分別對程序的運行效率有哪些影響

內存分配?
堆棧的綜合效率最高(除寄存器外),一般函數(包括main())的變數都是在堆棧內的。
你可以顯示聲明register 但是是存在寄存器還是一般的堆棧完全由編譯器決定優化,其實你加了也沒用。。。。。堆棧是在內存的一塊固定大小的區域,比較小,數據量大了會爆棧(綜合最高是因為會有部分內容進入稿茄局寄存器,寄存器比內存快)。
全局變數是在全局變數區的,全局變數區是在內存中的固定大小的一塊區域。全局變數區也不怎麼大,但是比堆棧大多了。。。。
函數代碼區。。。是在內存 你無視好了。。。
堆區 是在內存的一塊很大很大的區域,一切動態建立的對象(c用alloc家族函數 c++的new)都是在堆區,一般堆區是不會爆的,除非真的很大大大大大。。
效率上講 寄存器納運最快,然後就是內存了,磁碟的讀寫不考慮。
綜上,編譯器會幫你優化的,你只要關心會不會爆棧,會不會爆全局變數,就行了。。
還有字元串常量區,也是在內存中的,你也無視好了。。。。。
還有靜態區也是在內鍵讓存中的,大小是編譯器編譯時決定的,你也無視好了。。。。

『柒』 C語言中是如何釋放內存單元的;原理又是什麼

C管理內存大致可以理解為兩種,分配在棧上的,一個是分配在堆上的。

臨時變數,動態變數,分配在棧上,運行完,直接彈出棧,就沒了。
分配在堆上的內存,釋放的時候,基本上可以理解為,指針不指這里了。也就失去了對這塊內存的控制。其實所謂的釋放。字面意思容易讓人理解錯。
有些機器有些操作系統,會在釋放的時候清空這段內存,但是這種做法效率不高,但是安全,很少有機器這么做,多數都是所謂釋放,就是不讓你控制這塊內存了而已。

熱點內容
釘釘密碼密碼是什麼 發布:2024-11-01 20:34:51 瀏覽:730
老款卡羅拉自動擋有哪些配置 發布:2024-11-01 20:34:06 瀏覽:570
android圖片判斷 發布:2024-11-01 20:34:03 瀏覽:267
怎麼給自己手機寫一個腳本 發布:2024-11-01 20:23:41 瀏覽:241
c語言大小寫判斷 發布:2024-11-01 20:21:53 瀏覽:130
php的點餐系統源碼 發布:2024-11-01 20:13:53 瀏覽:714
拜占庭演算法 發布:2024-11-01 20:10:31 瀏覽:357
xcode編譯參數 發布:2024-11-01 20:00:04 瀏覽:665
蘋果5怎麼設置密碼鎖屏 發布:2024-11-01 19:54:55 瀏覽:124
寶塔上傳文件夾 發布:2024-11-01 19:39:50 瀏覽:257