當前位置:首頁 » 編程語言 » c語言內存操作

c語言內存操作

發布時間: 2023-02-13 13:16:50

c語言內存怎麼回收和代碼是什麼

在C語言中,使用malloc來動態申請內存,申請完後必須釋放該空間。如果不手動釋放,那麼只能等程序運行結束後系統去回收,但在程序運行過程中容易造成內存溢出的問題,所以應該使用free(void*)來手動釋放申請的空間,這樣可以保證程序的健壯性。案例如下:x0dx0a #include "stdio.h"x0dx0a #include "stdlib.h"x0dx0a #include "string.h"x0dx0a void main()x0dx0a {x0dx0a //申請20個位元組空間x0dx0a char *str = (char*)malloc(20);x0dx0a //將空間內容設置為\0x0dx0a memset(str, '\0', 20);x0dx0a //為每個位元組空間賦值x0dx0a char *p = str;x0dx0a for (int i = 0; i < 10; i++)x0dx0a {x0dx0a *p++ = 'a' + i;x0dx0a }x0dx0a printf("str=%s\n",str);x0dx0a //釋放申請的空間,交回給系統x0dx0a free(str);x0dx0a }x0dx0a運行結果為:x0dx0astr=abcdefghijx0dx0aPress any key to continuex0dx0a x0dx0a這個案例很簡單,但也很能說明問題,我想應該對你幫助,呵呵。x0dx0a x0dx0a補充:在C++中,動態申請空間使用new方法(new方法底層調用的其實是malloc方法),釋放時使用delete方法(底層調用的是free)。

② c語言 怎麼讀內存數據

分配內存空間然後讀取

#include<stdio.h>

#include<stdlib.h>

intfilelength(FILE*fp);

char*readfile(char*path);

intmain(void)

{

FILE*fp;

char*string;

string=readfile("c:/c.c");

printf("讀入完畢 按任意鍵釋放內存資源 ");

//printf("%s ",string);

system("pause");

return0;

}

char*readfile(char*path)

{

FILE*fp;

intlength;

char*ch;

if((fp=fopen(path,"r"))==NULL)

{

printf("openfile%serror. ",path);

exit(0);

}

length=filelength(fp);

ch=(char*)malloc(length);

fread(ch,length,1,fp);

*(ch+length-1)='';

returnch;

}

intfilelength(FILE*fp)

{

intnum;

fseek(fp,0,SEEK_END);

num=ftell(fp);

fseek(fp,0,SEEK_SET);

returnnum;

}

(2)c語言內存操作擴展閱讀

cLinux進程間通信共享內存:

#include"comm.h"

staticintcommShm(intsize,intflags)//創建共享內存

{

key_tkey=ftok(PATHNAME,PROJ_ID);

if(key<0){

perror("ftok");

return-1;

}

intshmid=shmget(key,size,flags);

if(shmid<0){

perror("shmget");

return-2;

}

returnshmid;

}

intcreateShm(intsize)

{

returncommShm(size,IPC_CREAT|IPC_EXCL);

}

intgetShm(intsize)//獲取共享內存

{

returncommShm(size,IPC_CREAT);

}

intdestoryShm(intshmid)//銷毀共享內存

{

if(shmctl(shmid,IPC_RMID,NULL)<0){

perror("shmctl");

return-3;

}

}

③ C語言中分配內存

要實現根據程序的需要動態分配存儲空間,就必須用到以下幾個函數
1、malloc函數
malloc函數的原型為:
void
*malloc
(u
igned
int
size)
其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否為NULL並執行相應的操作。
下例是一個動態分配的程序:
#include
#include
main()
{
int
count,*array;
/*count是一個計數器,array是一個整型指針,也可以理解為指向一個整型數組的首地址*/
if((array(int
*)
malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存儲空間。");
exit(1);
}
for
(count=0;count〈10;count++)
/*給數組賦值*/
array[count]=count;
for(count=0;count〈10;count++)
/*列印數組元素*/
printf("%2d",array[count]);
}
上例中動態分配了10個整型存儲區域,然後進行賦值並列印。例中if((array(int
*)
malloc(10*sizeof(int)))==NULL)語句可以分為以下幾步:
1)分配10個整型的連續存儲空間,並返回一個指向其起始地址的整型指針
2)把此整型指針地址賦給array
3)檢測返回值是否為NULL
2、free函數
由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。
其函數原型是:
void
free(void
*p)
作用是釋放指針p所指向的內存區。
其參數p必須是先前調用malloc函數或calloc函數(另一個動態分配存儲區域的函數)時返回的指針。給free函數傳遞其它的值很可能造成死機或其它災難性的後果。
注意:這里重要的是指針的值,而不是用來申請動態內存的指針本身。例:
int
*p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2)
/*或者free(p2)*/
malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函數的參數。
malloc函數是對存儲區域進行分配的。
free函數是釋放已經不用的內存區域的。
所以由這兩個函數就可以實現對內存區域進行動態分配並進行簡單的管理了。

④ C語言問題:內存的分配方式有哪幾種

1、靜態存儲區分配

內存分配在程序編譯之前完成,且在程序的整個運行期間都存在,例如全局變數、靜態變數等。

2、棧上分配

在函數執行時,函數內的局部變數的存儲單元在棧上創建,函數執行結束時這些存儲單元自動釋放。

3、堆上分配

堆分配(又稱動態內存分配)。程序在運行時用malloc或者new申請內存,程序員自己用free或者delete釋放,動態內存的生存期由我們自己決定。

(4)c語言內存操作擴展閱讀

棧上分配數組

#include<iostream>

usingnamespacestd;

voidmain()

{

int**arr=NULL;//int型二維數組

introws,columns;

cin>>rows;//2

cin>>columns;//3

//請在此處編寫代碼,根據rows和columns在棧上分配一個數組arr

...你的代碼...

//賦值給數組元素

for(introwIndex=0;rowIndex<rows;rowIndex++)

{

for(intcolumnIndex=0;columnIndex<columns;columnIndex++)

{

arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;

}

}

//列印每個數組元素

for(rowIndex=0;rowIndex<rows;rowIndex++)

{

for(intcolumnIndex=0;columnIndex<columns;columnIndex++)

{

printf("%d",arr[rowIndex][columnIndex]);

}

printf(" ");

}

}

⑤ 內存釋放的時候具體進行了什麼操作(C語言)

當你用malloc或者calloc申請內存之後,這部分內存會用於存儲特定的數據,而無法被其他的變數使用。而當你如果不釋放,可能會引起內存佔用過多。而如果內存佔用過多的話,可能的結果就是電腦癱瘓。這也就是常說的「內存泄漏」。函數原型為:void
free
(void
*
p),一般使用為free(p);(p為指向一個已分配空間的指針)。在執行這個語句時,電腦就可以把這部分內存分配給其他變數。也就算是釋放了。

⑥ c語言怎麼對程序內存進行讀寫

使用fopen的r方式可以實現讀取,用w+方式可以實現寫入。
1.fopen的函數原型:FILE * fopen(const char * path,const char * mode);
fopen函數的第一個參數是文件路徑,第二個參數是打開方式,有以下幾種方式:
r 以只讀方式打開文件,該文件必須存在。
r+ 以可讀寫方式打開文件,該文件必須存在。
rb+ 讀寫打開一個二進制文件,允許讀數據。
rw+ 讀寫打開一個文本文件,允許讀和寫。
w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。
w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。
a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)
a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留)
wb 只寫打開或新建一個二進制文件;只允許寫數據。
wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。
wt+ 讀寫打開或著建立一個文本文件;允許讀寫。
at+ 讀寫打開一個文本文件,允許讀或在文本末追加數據。
ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。
上述的形態字元串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫打開的文件為二進制文件,而非純文字文件。
返回值:文件順利打開後,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno中。

⑦ c語言程序運行時 內存問題

以程序的具體執行過程為例來給你講解,但願你能理解:
1.程序被打開時,即程序開始運行時,會首先向操作系統請求獨占內存空間(一段在程序整個執行過程中都不釋放的空間),操作系統會應答請求並分配一段邏輯上連續(其實是將零散的內存空間映射為一段連續的空間)的內存空間給該程序,此時程序得到該段空間的邏輯地址信息,根據地址將程序代碼段和數據段裝入內存,此時程序載入完成。
2.程序運行中,當某一過程任務需要更大內存空間時,會再次向操作系統發出請求,操作系統會根據請求再次分配內存空間給該程序,當這一過程任務執行完畢後,該內存空間被釋放。同時由於操作系統的存儲保護,程序在運行過程中只能訪問自己所申請的內存空間,不能訪問其他程序的內存空間。
3.當程序執行完畢或關閉程序後,該程序所佔的所有內存空間都被釋放。
當你再次打開程序後,重復上面的過程。
下面對你的問題進行針對性回答:
1.當程序運行時,會調入內存,不同時間運行,程序放在內存的位置也可能不同:每運行一次程序,程序都會重新向操作系統申請內存空間,這時操作系統會分配一段全新的內存空間給程序,故不同時間運行程序,程序在內存中的位置是不同的。
2.使用內存中數據的位置也可能不同:當程序申請內存空間後,操作系統會將所申請的內存空間的地址傳給程序,盡管數據的位置不同,但程序知道數據的地址,故程序依然可以根據地址來找到所需要的數據。

⑧ C語言-動態分配內存 malloc & free

需要用一個數組來保存用戶的輸入,但是卻不知道用戶會輸入多少條數據。

(1) 如果設一個太大的數組,則顯得浪費內存
(2) 如果設得太小,又怕不夠

問題:如何做到恰好夠用、又一點不浪費呢?

系統中存在一個內存管理器(MM, Memory Manager),它負責管理一堆閑置內存。它被設計用於解決此類問題。

MM提供的服務:應用程序可以向MM申請(借出)一塊指定大小的內存,用完之後再釋放(還回)。

應用程序在使用malloc時,要把返回值轉換成目標類型。

這塊內存和數組沒有本質區別,用法完全相同。

需要先計算需要多少位元組的內存空間

數組舉例子:

釋放的時候需要注意, 因為在for循環執行之後,p的地址往前移動了10, 所以需要減去10, 然後再釋放p,不然會有問題

// 當銷毀時只需要free一次,malloc了幾個位元組就會free幾個位元組,和char類型還是int類型無關
free(p);

在一個函數中動態分配的內存,在另一個函數中操作這塊內存

(1) MM是一個系統級的東西,所有的應用程序都向同一個MM申請內存。

(2) 何為借出?實際上,在內存被借出時,MM只是把它管理的內存標記了一下,表示該段內存已經被佔用。比如,它把每一段被佔用的內存給記錄下來(首地址,長度)
(p0,n0) (p1, n1) (p2, n2) ...

(3) MM非常慷慨:①只要有人 malloc ,它都同意借出 ②你不歸還,它永遠不會主動要求你 free 。

(4) MM管理的內存區域稱為「堆」Heap

這意味著,用戶程序應該自覺得及時 free ,以便不耽誤別的應用程序的使用。如果有個應用程序不停地 malloc ,而不 free ,那最終會用光MM的內存。當MM沒有更多閑置內存時, malloc 返回 NULL ,表示內存已經用完。

再次重申: 應用程序在malloc之後,應該盡早free !

使用原則:需要的時候再申請,不需要的時候立即釋放

實際上,MM對借出的內存塊進行標識
(p0, n0) (p1, n1) (p2, n2) ...
它內部已經保證任意兩塊內存不會「交疊」,即不會重疊,不會把一塊內存同時借給兩個應用程序使用。

所以,每塊內存的首地址都是不同的,在 free 的時候只需要指明首地址即可。

對象指的一塊內存

示例:用Citizen表示一個市民,用Car表示一個輛車。他起初沒有車,但未來可能有一輛車。

怎麼樣才算「及時」? 「不及時」會怎樣?

MM里可用的內存是有限的,你用完了就得盡快還,因為別的應用程序也需要MM的內存。

只借不還,積累到一定程度,MM沒有更多內存可用,於是malloc返回NULL。

要還就得全還,否則MM那邊處理不了

原因是:MM可能此時沒有閑置內存可用。(雖然這種情況一般不會發生)

free之後,該內存交還給MM,該內存不再可用(失效)

不一定要在相同的函數里釋放,在應用程序的任意一個角落釋放都是有效的。

也就是說:這一塊內存被malloc出來之後,完全交給你處置

功能:將 s 中當前位置後面的 n 個位元組 (typedef unsigned int size_t )用 ch 替換並返回 s

參數:

參數:

功能:由 src 所指內存區域復制 n 個位元組到 dest 所指內存區域。

memmove() 功能用法和 memcpy()) 一樣,區別在於: dest
和 src 所指的內存空間重疊時, memmove() 仍然能處理,不過執行效率比 memcpy() 低一些

⑨ c語言內存有幾種分配方式

基本上C程序的元素存儲在內存的時候有3種分配策略:
靜態分配
如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端
自動分配
函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。
所以說C函數永遠不應該返回一個局部變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。
使用堆(Heap)內存將帶來額外的開銷和風險。

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

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

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

熱點內容
linux抓包工具 發布:2024-11-08 20:25:07 瀏覽:458
我的世界神奇寶貝伺服器聯機生存 發布:2024-11-08 20:17:07 瀏覽:722
溫州少兒編程 發布:2024-11-08 20:16:28 瀏覽:549
伺服器硬體有什麼 發布:2024-11-08 20:13:52 瀏覽:319
windows存儲分層 發布:2024-11-08 20:04:34 瀏覽:753
淘寶客服電腦伺服器 發布:2024-11-08 19:39:26 瀏覽:910
伺服器4t如何擴容8t 發布:2024-11-08 19:32:27 瀏覽:297
網易我的世界電腦版好玩伺服器 發布:2024-11-08 19:16:06 瀏覽:414
學校電腦配置有哪些 發布:2024-11-08 19:00:40 瀏覽:267
安卓手機音量均衡器在哪裡 發布:2024-11-08 18:55:15 瀏覽:687