本篇 ShengYu 介紹 C/C++ malloc 用法與範例,malloc 是用來配置一段記憶體區塊的函式,以下介紹如何使用 malloc 函式。
C/C++ 可以使用 malloc 來配置一段記憶體區塊,要使用 malloc 的話需要引入的標頭檔 <stdlib.h>
,如果要使用 C++ 的標頭檔則是引入 <cstdlib>
,
malloc 函式原型為1
void* malloc(size_t size);
malloc()
配置 size bytes 的記憶體區塊,會回傳一個指向該記憶體開頭的指標,這些記憶體的內容是尚未被初始化的,也就是說裡面目前存放的數值是未知的,如果配置失敗的話會回傳 null pointer (NULL),配置成功的話會回傳 void *
指標,void *
指標能被轉成任何一種類型的指標,來看看下面的 malloc 用法範例吧!
使用 malloc 配置 20 bytes 記憶體大小的區塊,回傳的 ptr 檢查一下是不是 NULL,之後使用 strcpy()
複製字串到 ptr 裡並印出來,使用完 ptr 後別忘記了要使用 free() 歸還記憶體區塊。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// g++ cpp-malloc.cpp -o a.out
int main() {
char * ptr;
ptr = (char *) malloc(sizeof(char) * 20);
if (ptr == NULL) {
printf("malloc failed\n");
exit(1);
}
strcpy(ptr, "Hello World");
printf("%s\n", ptr);
free(ptr);
return 0;
}
結果如下,1
Hello World
malloc int 一維陣列
這邊示範動態記憶體配置一個 int 一維陣列的寫法,1
2
3int *p = (int *) malloc(sizeof(int) * 3);
...
free(p);
如果要分成兩行寫的話,1
2
3
4int *p;
p = (int *) malloc(sizeof(int) * 3);
...
free(p);
再來看看怎麼配置一維陣列後,再給初始值,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// g++ cpp-malloc2.cpp -o a.out
int main() {
int *p = (int *) malloc(sizeof(int) * 3);
p[0] = 1;
p[1] = 2;
p[2] = 3;
printf("%d,%d,%d\n", p[0], p[1], p[2]);
free(p);
return 0;
}
輸出如下,1
1,2,3
malloc int 二維陣列
動態配置二維陣列這個通常會在影像處理中使用到這個技巧,假設我們要配置 3 * 4 大小的 int 二維陣列,注意在使用完該變數後還是要將其變數 free 歸還記憶體,二維陣列怎麼 malloc 的,free 時就怎麼 free。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30// g++ cpp-malloc3.cpp -o a.out
int main() {
int **p = (int **) malloc(sizeof(int *) * 3);
for (int i = 0; i < 3; i++) {
p[i] = (int *) malloc(sizeof(int) * 4);
for (int j = 0; j < 4; j++) {
p[i][j] = 0;
}
}
p[0][1] = 1;
p[1][1] = 2;
p[2][1] = 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", p[i][j]);
}
printf("\n");
}
for (int i = 0; i < 3; i++) {
free(p[i]);
}
free(p);
return 0;
}
二維陣列輸出結果如下,1
2
30 1 0 0
0 2 0 0
0 3 0 0
如果要在記憶體分配的同時初始化成 0 的話可以改用 calloc,就不用像上面用 malloc 完後一一去初始化,這也是 malloc 與 calloc 的差異,
malloc 分配記憶體時是不初始化的,calloc 分配記憶體的同時也初始化成 0,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27// g++ cpp-malloc4.cpp -o a.out
int main() {
int **p = (int **) malloc(sizeof(int *) * 3);
for (int i = 0; i < 3; i++) {
p[i] = (int *) calloc(4, sizeof(int));
}
p[0][1] = 1;
p[1][1] = 2;
p[2][1] = 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", p[i][j]);
}
printf("\n");
}
for (int i = 0; i < 3; i++) {
free(p[i]);
}
free(p);
return 0;
}
以上就是 C/C++ malloc 的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
其它參考
malloc - C++ Reference
https://www.cplusplus.com/reference/cstdlib/malloc/
其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ memset 用法與範例
C/C++ memcpy 用法與範例
C++ new 動態記憶體配置用法與範例
C++ malloc invalid conversion from void* to int* 無效的轉換