C/C++ malloc 用法與範例

本篇 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() 歸還記憶體區塊。

cpp-malloc.cpp
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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
3
int *p = (int *) malloc(sizeof(int) * 3);
...
free(p);

如果要分成兩行寫的話,

1
2
3
4
int *p;
p = (int *) malloc(sizeof(int) * 3);
...
free(p);

再來看看怎麼配置一維陣列後,再給初始值,

cpp-malloc2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ cpp-malloc2.cpp -o a.out
#include <stdio.h>
#include <stdlib.h>

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。

cpp-malloc3.cpp
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
#include <stdio.h>
#include <stdlib.h>

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
3
0 1 0 0 
0 2 0 0
0 3 0 0

如果要在記憶體分配的同時初始化成 0 的話可以改用 calloc,就不用像上面用 malloc 完後一一去初始化,這也是 malloc 與 calloc 的差異,
malloc 分配記憶體時是不初始化的,calloc 分配記憶體的同時也初始化成 0,

cpp-malloc4.cpp
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
#include <stdio.h>
#include <stdlib.h>

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* 無效的轉換