❶ 在c語言中,如何給函數分配內存
不知lz有沒聽說過虛存一說,當源碼被編譯成二進制文件後,其中的變數,函數的虛擬地址,也就是內存空間中的地址就已確定,在運行時,操作系統為其分配物理內存並添加虛擬地址到物理地址的映射。
再說的多一點,一個進程(運行的程序)可分為若干段:代碼段、數據段、堆棧段等,其中函數所操作的空間(也就是局部變數的空間)就位於堆棧段,所謂函數分配內存大小,實際就是堆棧段指針的變化而已。
❷ 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個位元組。
❸ C語言中的動態內存分配的用法舉例
1、malloc函數:其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。
2、free函數:由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。
3、calloc函數:其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。
(3)c語言如何分配空間擴展閱讀:
函數運算符:
new
運算符new用於向系統申請動態存儲空間,並把首地址作為運算結果,它的使用形式為:
指針變數=new 數據類型;
例如:
int *p=new int
該語句的作用是會用new從內存中申請了一個int型變數(4個位元組),並將該變數的首地址賦給指針變數p。
new所建立的變數的初始值是任意的,也可在用new分配內存的同時進行初始化。使用形式為:
指針變數=new 數據類型(初始值)。
delete
堆內存可按照要求進行分配,程序對內存的需求量隨時會發生變化,有時程序在運行種可能會不再需要由new分配的內存空間,而且程序還未運行結束,這時就需要把先前佔用的內存空間釋放給堆內存,以後重新分配,供程序的其他部分使用。運算符delete用於釋放new分配的內存空間,刪除建立的對象,它的使用形式為:
delete指針變數;
其中的指針變數中保存著new分配的內存的首地址。
❹ C語言中對一個定義一個變數就是為其在內存中分配一個空間,那個空間最開始從哪分配起
一個由C/C++編譯的程序佔用的內存分為以下幾個部分:
①棧區(stack)- 程序運行時由編譯器自動分配,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。程序結束時由編譯器自動釋放。
②堆區(heap) - 在內存開辟另一塊存儲區域。一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
③全局區(靜態區)(static)-編譯器編譯時即分配內存。全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後由系統釋放
④文字常量區 -常量字元串就是放在這里的。 程序結束後由系統釋放。
⑤程序代碼區-存放函數體的二進制代碼。
❺ c語言數組在內存中是怎麼分配的
C語言中內存為分三類:棧區、堆區、靜態數據區。
局部變數在棧上分配,函數調用前的棧指針,要和函數返回後的棧指針一樣,否則就會出錯。
void test(void)
{
char i,a[10];
printf("0x%x", &i);
printf("0x%x", a);
printf("0x%x", a+1);
printf("0x%x", a+2);
printf("0x%x", a+3);
}
(5)c語言如何分配空間擴展閱讀
c語言數組在內存分配
示例:
#include<stdio.h>
int main()
{
int a[4] = {11,12,13,14};
int b[4] = {21,22,23,24};
int *pa = &a;
int i = 0;
while(i<8)
{
i++;
printf("now *p value = %d and",*pa);
printf("p addr value = %d ",pa);
pa++;
}
return 0;
}