當前位置:首頁 » 編程語言 » c語言怎麼無限開內存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言怎麼無限開內存

發布時間: 2022-08-10 02:29:25

A. 用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雖然不太一樣,但原理差不多。

B. c語言開辟內存的問題

①C語言編碼的時候不會開辟內存,只有在編譯之後才會生成可執行程序,在可執行程序裡面給出內存的開辟方法。
②真正內存的開辟是在程序運行的時候。程序裝載到內存裡面,開始運行才會真正開辟內存。
③C語言程序裝載到內存中之後,其在內存中的進程空間中有代碼區、全局數據區、堆區和棧區。代碼區存放代碼編譯後的執行指令;全局數據區存放全局變數和靜態變數;棧區存放函數內部的局部變數和返回地址,這部分內存是在函數調用時才申請的;堆區是自由申請內存的區域。需要使用malloc等自己分配內存,這部分內存需要自己釋放。
④向int i;這樣的句子,在C語言中,既是聲明又是定義,所以這樣的語句其實已經分配了內存,而不是等到賦值的時候。
⑤有不懂的可以追問。

C. c語言中,如何申請較大的內存空間

用malloc應該可以的吧

再不行,用靜態的,如p[512*1024*1024]
聲明成全局的,因為局部變數在棧中,棧沒有這么大

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

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

E. c語言 在一個線程上開辟一段內存;

這個不是C語言能做的,因為有「類」。
基本實現思路和@fengfei5551223 類似
提出一些不同的實現細節:
1、申請空間為了做到最大化兼容,使用void指針;size是具體的數值
void * buf=NULL;
void create_memory(){
buf=(void *) malloc(size);//
}

2、你的要求是開辟內存,寫內存,讀內存,那麼應該是操作的同一塊內存區域,
因此傳參數不能總是調用create_memory方法,否則每次總是新申請內存,
沒有達到共用的目的
class A{
char *buf=NULL
public:
//增加一個獲取開辟空間地址函數
void *get_buf(){
return buf;

}
};
int main(){
A *a;
pthread_create(&a[0],NULL,a->create_memory,NULL);
if(NULL != a->get_buf()){ // 為了保證開辟成功內存
//將開辟好的空間地址作為參數傳遞給其它線程使用
pthread_create(&a[1],NULL,a->write_memory,a->get_buf());
pthread_create(&a[2],NULL,a->read_memory,a->get_buf());
}
。。。
}

3、對開辟出的內存區域沒有最終銷毀這個是很危險的,
當然我不清楚你的需求,但是大多數場景下還有最後一步是做destory;

而且要用到同步互斥變數,所以最後需要報這些變數銷毀;

這樣使得程序更具有健壯性。

F. c語言里如何開辟一片沒有上限的內存來存數據我知道可以用數組,但是數組要設置數組大小,我現在不想設

C語言里貌似沒有這種東西……要分配內存就必須指定大小,如果是C++使用STL容器應該可以……

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

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

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

H. 怎麼用C語言寫個循環來占滿4G內存

#include<stdio.h>
#include<stdlib.h>
# include<string.h>
void main()
{
int *a;
int b=1024*1024*sizeof(int);
int i=0;
while(1) {
a=(int *)malloc(b);
memset(a, i++, sizeof(b)); //評論說扛住了,估計是編譯器優化了,只好上大殺器了

}

卡死你。。。

I. C語言中如何動態增加內存空間

有一個malloc函數,專門用來進行動態內存管理的