動態記憶體分配

2022-05-26 04:48:09 字數 1867 閱讀 1261

定義陣列的長度的時候,必須指定長度,這是在編譯期間就要確定的。

當我們無法在編譯期間確定到底需要多大的記憶體塊,此時就無法定義陣列的大小:

此時就需要在執行的時候根據實際的情況(比如根據輸入的資料的大小),來動態的申請記憶體空間,然後讓指標指向這塊新申請的記憶體。

malloc和free是庫函式,不是系統呼叫

#include "stdlib.h"

void * malloc(size_t size);

void free(void* pointer);

#include "stdlib.h"

void* `calloc`(size_t num,size_t size);

void* `realloc`(void* pointer,size_t new_size);

int main(void)

int main(void)

int i = 0;

for (i = 0; i <= 10; i++) // 訪問越界

free(p);

p = null;

system("pause");

return 0;

}

int main(void)

int main(void)

p++;

free(p); // 釋放部分動態申請的記憶體

system("pause");

return 0;

}

int main(void)

free(p);

free(p); // 第二次釋放

system("pause");

return 0;

}

int main(void)

system("pause");

return 0;

}

#pragma once

#include "stdio.h"

#include "malloc.h"

#define malloc(n) mallocex(n,__file__,__line__)

#define free(p) freeex(p)

void *mallocex(size_t n, const char *file, const int line);

void freeex(void *p);

void print_leak_info();

#include "mleak.h"

#define maxsize 256

typedef struct

mallocitem;

static mallocitem g_record[maxsize];

void *mallocex(size_t n, const char *file, const int line)

} }return p;

}void freeex(void *p)

} }}void print_leak_info()

}}

#include "stdio.h"

#include "stdlib.h"

#include "mleak.h"

void f()

int main()

結果:

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...