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

c語言分配和撤銷內存

發布時間: 2022-08-12 11:58:34

『壹』 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語言內存有幾種分配方式

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

『叄』 c++中new和delete的用法

在C++編程中,使用new分配的數組可用delete釋放。這里釋放的是動態分配的數組空間,而不是靜態分配的數組空間,詳細步驟:

1、例如,我們動態創建了一個一維int數組arr,現在需要將它釋放。

『肆』 筆試:c語言變數內存分配問題

A.auto B.static C.register D.extern
A 的變數在堆棧里,自然是運行時
B 是靜態變數
C 是寄存器變數,使用的是cpu的寄存器
D 是全局變數

BD都是放在數據段中的,編譯的時候就已經確定了位置(有的編譯器對b和d的處理不一樣)

『伍』 請問在C語言編程時,怎樣才能更加合理的分配和使用內存

那應該是你在堆上分配的空間(就是用new或malloc之類分配的空間)沒有收回,而造成內存泄漏了吧!程序運行的時間長了就把內存給泄漏光了。。。(可能性最大)
要不就是棧空間被你用完了?~~~比如在棧上分配了很大的數組之類的,造成棧溢出什麼的。(這也有可能)
再或者,你頻繁的在堆上分配和釋放空間,最終造成內存碎片,而無法分配到你所要求的整塊空間了。(這種可能最小。。。特別是現在的操作系統內存管理都很優秀的,除非你是在嵌入式系統中運行的)

『陸』 用C語言結構體指針編程序實現輸入十個學生的學號,期中和期末成績,計算輸出成績表和學生平均分

#include<iostream>
#include<string>

using namespace std;
//=============<開始定義結構體>===================================================
struct combox{

int num;
int mark;
string name;
combox *next;

};
//=============<結束定義結構體>===================================================

//=============<開始定義Commonbox類>==============================================

//-----類體開始------------------------
class Commonbox{

private:

combox *head;void Swap(combox *,combox *); //交換兩個combox變數的數據域

void Print(combox *); //輸出一combox指定的記錄

combox *Find(int); //查找條例條件的記錄,並返回該記錄的指針

public:

Commonbox(){head=NULL;}

int ListCount(); //統計當前鏈表的記錄總數,返回一個整數

void AddItem(int num, string name, int mark); //添加一條記錄到表尾
void RemoveItem(int); //刪除一條指定的記錄

void List(); //列出當前鏈表中的所有記錄

void Sort(); //對當前鏈表進行排序

void Search(int); //在當前鏈表查找指定記錄並輸出

float Average(); //計算平均成績

(6)c語言分配和撤銷內存擴展閱讀

用C語言結構體指針編程序應用方法:

將一個結構體變數中的數據傳遞給另一個函數,有下列3種方法:

(1) 用結構體變數名作參數。一般較少用這種方法。

(2) 用指向結構體變數的指針作實參,將結構體變數的地址傳給形參。

(3) 用結構體變數的引用變數作函數參數。

在軟體開發過程中,常常需要動態地分配和撤銷內存空間,例如對動態鏈表中結點的插入與刪除。C語言中是利用庫函數malloc和free來分配和撤銷內存空間的。

『柒』 c語言裡面的結構體是什麼意思

結構體(struct)是由一系列具有相同類型或不同類型的數據構成的數據集合,叫做結構。

在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變數、指針或數組等,用以實現較復雜的數據結構。

結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問

(7)c語言分配和撤銷內存擴展閱讀

將一個結構體變數中的數據傳遞給另一個函數,有下列3種方法:

(1) 用結構體變數名作參數。一般較少用這種方法。

(2) 用指向結構體變數的指針作實參,將結構體變數的地址傳給形參。

(3) 用結構體變數的引用變數作函數參數。

在軟體開發過程中,常常需要動態地分配和撤銷內存空間,例如對動態鏈表中結點的插入與刪除。C語言中是利用庫函數malloc和free來分配和撤銷內存空間的。

『捌』 c語言分配內存方式有哪些

內存分配方式有三種:

1、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變數,static變數。
2、在棧上創建。在執行函數時,函數內局部變數的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。
3、從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現內存泄漏,頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。

『玖』 C語言局部變數是何時分配和回收空間的如圖中所有的變數他們的分配和銷毀都是在什麼時候呢

前面所以回答都不全面。
1、局部變數所佔用的內存空間的分配和銷毀,取決於編譯器的實現,編譯器在為了優化程序性能,可能有不同的策略來分配、釋放內存。比如:VC編譯器可能在函數入口處即分配這里的全部變數,GCC編譯器也可能真的在定義處才分配。
2、你該探究的應該是這些局部變數的生命期。這個b\c\d\e 的生命期都是開始於定義變數的地方,終止於語句塊結束的地方(對應的反花括弧處結束)
3、這是 C++ 的代碼,C 的代碼必須在函數開始處定義所有局部變數,以便於編譯器為所有局部變數准備棧空間。所以有你這個困惑(局部變數在函數入口時就全部入棧,這個說法是錯的么?)

『拾』 c語言,動態分配內存,急

realloc原型是
extern
void
*realloc(void
*mem_address,
unsigned
int
newsize);
用於內存不夠時重新分配內存,返回目標內存基址,
第一個參數是原內存地址,第二個參數是申請的內存空間
該函數執行時會把原地址的值先搬過來,所以不會改變原來的數據。