C語言 動態記憶體分配

2021-06-26 15:23:51 字數 3880 閱讀 9375

動態記憶體分配

一.記憶體的五個分割槽

1.棧區後進先出, 從高到底分配記憶體

int a = 2;

int b = 3;

printf("棧區: %p\n", &a);

printf("棧區: %p\n", &b);

2.堆區

堆區分配記憶體, 從低到高

堆區的記憶體由我們自己進行分配和釋放

int *c = malloc(10);    

printf("堆區: %p\n", c);

3.靜態區

全域性變數和被static修飾的靜態變數

靜態變數 再一次程式執行過程中, 只分配一次記憶體

static int d = 5;    

printf("靜態: %p\n", &d);

4.常量區

記憶體是唯讀的, 不可修改

char *ss ="李四";    

char *e = "zhangsan";

printf("常量: %p\n", e);

5.**區

程式執行的**都儲存在**區

void testmemory()

printf("**: %p\n", testmemory);

當程式執行完畢. 全釋放掉

常量區和靜態區的記憶體

二.記憶體分配的相關函式

1.malloc函式

將堆區記憶體分配4個位元組給乙個int型的指標

返回值 void * 代表任意指標

引數; 分配的記憶體大小

考慮到平台不同, 可以用sizeof(char)來確定1個位元組

int *p= malloc(sizeof(char) * 4);

使用:

*p = 4;

在堆區分配8個位元組

char *pp = malloc(sizeof(char) * 8) ;

malloc 對記憶體的分配不負責清空內容

對str進行的操作和之前的指標操作一致, 比如可以進行字元竄拷貝

strcpystr(pp, "xiansen");

printf("%s\n", pp);

在堆區分配int型別的資料

int *ppp = malloc(sizeof(int) * 5);

結構體一樣

student *stu = malloc(sizeof(student) * 3);

對分配的記憶體釋放

無返回值, 有乙個引數, 填任意型別的指標

釋放記憶體的時候, 只是對記憶體標記為可用, 並沒有對記憶體進行清空

free(stu);

free(pp);

free(p);

free(ppp);

free(c);

練習:有一字串,其中包含數字,提取其中的數字.要求動態分配記憶體儲存

// 定義變數來儲存數字的個數

int count = 0;

// 定義乙個字串

char array = "1asd34f6asd4f3as1d";

char *p = array;

// 迴圈條件

while (*p != '\0')

// 每次迴圈都讓指標向下移位

p++;

}// 分配空間

char * pp = malloc(sizeof(char) * count + 1);

// 指標歸位

p = array;

// 迴圈遍歷

while (*p != '\0')

// 在末尾新增'\0'

if(*(p + 1) == '\0')

// 每次迴圈都讓指標向下移位

p++;

}// 指標歸位

pp = pp - count;

// 列印

printf("%s", pp);

free(pp);

練習2:輸入3個學員的姓名,動態分配記憶體儲存學員姓名,並在最後輸出

// 儲存輸入的內容

char *name[3] = ;

char temp[50] = ;

for (int i = 0; i < 3; i++)

// 輸出

for (int i = 0; i < 3; i++)

// 釋放

for (int i = 0; i < 3; i++)

3.其他的記憶體管理函式

calloc

跟malloc一樣, 區別在於在分配記憶體的時候清空所有內容, 在效率上略低

引數1: 分配多少個記憶體,

引數2: 每乙個記憶體有多大

char *str = calloc(2, sizeof(char));

realloc

重新分配記憶體大小

引數1: 給誰分配

引數2: 重新分配的大小

str = realloc(str, 100);

三.記憶體操作函式

1.初始化記憶體

引數1: 初始化誰

引數2: 初始化的值

引數3: 初始化多少個位元組

str = memset(str, 65, 13);    

printf("%s\n", str);

2.記憶體拷貝函式

引數1:

拷貝到誰

引數2: 從誰拷貝(source)

引數3: 拷貝多少位元組

跟字串拷貝函式的區別; 字串拷貝只能夠拷貝字串, 記憶體拷貝可以拷貝任何內容

memcpy(str + 1,"iii" , 3);

printf("%s\n", str);

3.記憶體比較

引數1和引數2: 要比較兩塊記憶體

引數3: 比較多少位元組

返回值: 如果兩個記憶體完全一樣, 返回0, 如果不一樣, 就把不一樣的記憶體內容取差值返回

int result = memcmp(str, "aaa", 3);    

printf("%d", result);

練習:定義兩個整型指標,分別用malloc、calloc對其分配空間儲存3個元素,malloc分配的空間用memset清零,隨機對陣列進行賦值隨機範圍1-3,賦值後用memcmp比較兩個陣列。如果相同列印good!否則列印

failed...

int *p = malloc(sizeof(int) * 3);    

int *pp = calloc(3, sizeof(int));

memset(p, 0, 12);

for (int i = 0; i < 3; i++)

if (memcmp(pp, p, 12) != 0) else

free(p);

free(pp);

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言動態記憶體分配

c語言動態記憶體分配 動態資料結構可以在執行時靈活新增 刪除或重排資料項。在執行時分配記憶體空間的過程稱為動態記憶體分配。記憶體分配函式如下 malloc 分配所需的位元組大小,並返回指向所分配空間的第乙個位元組的指標 calloc 為元素陣列分配空間,並初始化為零,然後返回指向該記憶體的指標 fr...

C語言 動態記憶體分配

c語言有儲存變數的區域稱之為棧 stack 除此之外 c語言還允許建立自己的動態記憶體區域 以存放一些臨時的資料 這區域稱之為 堆 heap 也就是存放執行時的資料 可以根據程式的需要 向系統申請所需大小的空間 由於未宣告部分定義他們為變數或者陣列因此只能通過指標去訪問 建立記憶體動態分配主要由4個...