當前位置:首頁 » 服務存儲 » c語言的動態存儲區
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言的動態存儲區

發布時間: 2022-07-16 09:51:17

① 關於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()函數釋放

② 在C語言中,什麼是動態存儲,什麼是靜態存儲

動態存儲是auto關鍵字,例如我們定義的int
a;
默認就是動態存儲,具體應該是
auto
int
a;一般是用於函數參數,局部變數,超出作用域范圍會失效,變數產生在動態存儲區
靜態存儲時static關鍵字,例如,我們定義一個
static
int
a;
就是存儲在靜態存儲區,相當於一個全局變數
一樓的理解出現了問題

③ C語言運行的內存要求是哪三個是不是程序代碼區,靜態存儲區和動態存儲區。求高人路過

一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後有系統釋放 4、文字常量區—常量字元串就是放在這里的。 程序結束後由系統釋放5、程序代碼區—存放函數體的二進制代碼。

④ [C語言] 動態存儲區 和 動態分配內存 的區別。萬分感謝!

(1)從變數的生存期分,有動態存儲和靜態存儲兩種,動態存儲即在調用函數時臨時分配單元,靜態存儲則是程序整個運行時間內都存在。動態存儲:形式參數(本函數內有效); auto自動變數(本函數內有效);register寄存器變數(本函數有效)。靜態存儲: 靜態局部變數(本函數內有效);靜態外部變數(本文件中有效)。參考http://..com/question/128146638.html?fr=newQuestion
(2)C語言里malloc函數分配的空間屬於動態存儲區的范疇。正如上面提到的auto自動變數,通過malloc來分配空間的都是自動變數。在C++里明確分開了棧、和自由存儲區。像自由變數里的局部變數(全局變數分配在「全局/靜態存儲區」)和函數都是存儲在棧區。而通過malloc分配的空間在自由存儲區。C語言沒有分那麼細,但是在動態存儲區內還是分棧和堆的,也就是,由malloc分配的空間在堆區;非malloc分配的局部變數,函數等在棧區;全局變數與靜態變數在靜態存儲區。
(3)區別在(2)里說的很清楚了,如果還有哪裡不是很明白可以看一下參考資料。
最後,祝您成功!

⑤ 在c語言中靜態存儲單元與動態存儲單元有什麼區別

曬曬
靜態的內存使用的是棧空間內存,不用程序員自己來分配.動態內存由程序員根據需要來自己分配並收回.
最大的區別在於動態的內存分配時候會用new關鍵字或malloc或calloc函數,之所以要程序員自己來分配內存是由於有時候不能確定程序要使用多少內存,比如要通過用戶或者文件或者資料庫中的查詢結果來確定使用多少數據,這時候程序員無法在程序的編寫的時候就把內存給固定分配出來.這時候必須得讓程序在運行的時候自己來為自己找到可用的內存,就一定要用動態的方式來分配內存.
舉個例子,根據用戶的輸入一個整數來確定用戶要輸入的數組維數,這個整數不是一定確定的數值,我們可以用一個變數n來表示,並用它接受用戶的輸入,再根據n來生成一個整數數組.程序不能寫成int
array[n];的形式,這樣程序是不能編譯通過的,這是因為n是一個不確定的數值.只能用new或malloc來通過用戶的輸入來分配內存.可以寫成這樣:
int
n;
cout
<<
"input
n:";
cin
>>
n;
cout
<<
endl;
int*
iArray
=
new
int[n];
for
(int
i
=
0;
i
<
n;
i++)
{
cin
>>iArray[i];

⑥ C語言動態和靜態存儲類別的區別

主要區別在於存儲區域和作用時間。
C語言的數據區分為靜態存儲區與動態存儲區。
靜態存儲是指在程序運行期間給變數分配固定存儲空間的方式。如全局變數存放在靜態存儲區中,程序運行時分配空間,程序運行完釋放。
動態存儲是指在程序運行時根據實際需要動態分配存儲空間的方式。如形式參數存放在動態存儲區中,在函數調用時分配空間,調用完成釋放。

⑦ C語言如何動態分配存儲空間

#include
<stdio.h>#include
<malloc.h>
int
main(){
int
*a,
n,
i;
printf("請輸入學生人數:");
scanf("%d",&n);
a
=
(int
*)malloc(sizeof(int)*n);
//動態分配內存,根據n分配
for(i=0;
i<n;
i++){
printf("請輸入學號為%d的學生成績:",i+1);
scanf("%d",&a[i]);
}
for(i=0;
i<n;
i++){
printf("學號:%d\t成績:%d\n",i+1,a[i]);
}
return
0;
}

⑧ 【C語言】動態存儲區 和 靜態存儲區 的基本問題。萬分感謝!!

malloc申請的空間在 動態儲存區中的堆區。
動態儲存區分為棧區和堆區。
又不懂的可以繼續追問~

⑨ C語言中的動態內存分配的用法舉例

1、malloc函數:其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。

2、free函數:由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。

3、calloc函數:其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。

(9)c語言的動態存儲區擴展閱讀:

函數運算符:

new

運算符new用於向系統申請動態存儲空間,並把首地址作為運算結果,它的使用形式為:

指針變數=new 數據類型;

例如:

int *p=new int

該語句的作用是會用new從內存中申請了一個int型變數(4個位元組),並將該變數的首地址賦給指針變數p。

new所建立的變數的初始值是任意的,也可在用new分配內存的同時進行初始化。使用形式為:

指針變數=new 數據類型(初始值)。

delete

堆內存可按照要求進行分配,程序對內存的需求量隨時會發生變化,有時程序在運行種可能會不再需要由new分配的內存空間,而且程序還未運行結束,這時就需要把先前佔用的內存空間釋放給堆內存,以後重新分配,供程序的其他部分使用。運算符delete用於釋放new分配的內存空間,刪除建立的對象,它的使用形式為:

delete指針變數;

其中的指針變數中保存著new分配的內存的首地址。

⑩ C語言中 局部變數和全局變數都是存儲在什麼區

C語言中局部變數存在棧里,全局變數存靜態存儲區。

局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。

全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;

(10)c語言的動態存儲區擴展閱讀

C語言中局部變數和全局變數示例:

#include<stdio.h>

#include<malloc.h>

staticints1=0,s2=0,s3=0;//靜態變數放在靜態區

intg1=0,g2=0,g3=0;//全局變數放在靜態區

voidmain()

{

staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//靜態變數

inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部變數放在棧區

charc1[]="aabb";//局部變數放在棧區

char*c2="aabb";//字元常量放在靜態區

char*m1=(char*)malloc(1);//堆區

char*m2=(char*)malloc(1);//堆區

char*m3=(char*)malloc(1);//堆區

printf("動態數據區 ");

printf("a1 a2 a3 ",&a1,&a2,&a3);

printf("c1 ",c1);

printf("m1 m2 m3 ",&m1,&m2,&m3);

printf("靜態數據區 ");

printf("s1 s2 s3 ",&s1,&s2,&s3);

printf("g1 g2 g3 ",&g1,&g2,&g3);

printf("s4 s5 s6 ",&s4,&s5,&s6);

printf("c2 ",c2);

}