C语言学习笔记:malloc/calloc动态内存分配

个人学习笔记,正误与否自行斟酌,欢迎讨论。

在C语言中,数组声明不能用变量,如 arr[ N ]

但可以这么做:

int * arr = (int *) malloc (sizeof(int) * N);

malloc函数原型为void *malloc(unsigned int size);

该函数返回为void型指针,因此必要时要进行类型转换,如 (int *)

sizeof ( int ) 代表数组中每个元素的类型为 int 型

N 代表数组的元素个数

所以malloc的意义是向 堆区 要了一块 这么大的空间

如果分配失败,则返回一个空指针(NULL)

malloc函数要搭配free函数使用,有借有还。

如,使用malloc动态申请一维数组:

使用malloc动态申请二维数组(二级指针):

calloc函数

1、函数简介

原型:void* calloc(unsigned int num,unsigned int size);

功能:在内存的动态存储区中分配num个长度为size的连续空间;

注意:num:对象个数,size:对象占据的内存字节数,相较于malloc函数,calloc函数会自动将内存初始化为0;

2、与malloc的区别

calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不做初始化,分配到的空间中的数据是随机数据。

其中malloc的简介如下:

原型:extern void* malloc(unsigned int size);

功能:动态分配内存;

注意:size仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故编程时建议通过以下方式给出,"长度 * sizeof(数据类型)";

3、用 法

void *calloc(size_t nmenb, size_t size);

当然,使用calloc后,也要使用 free(起始地址的指针) 对内存进行释放

注意:malloc与calloc用法的不同

如定义一个一维数组arr[ N ]:

(使用malloc)int * arr = (int *)malloc( N * sizeof( int ));

(使用 calloc)int * arr = (int *) calloc( N ,  sizeof( int ));

实列:

如此题,因为有了障碍物,网格中存在走不通的路,走不通的路应赋值为0,正好可以用calloc将整个dp[ i ][ j ]数组初始化为0,可以避免之后的一些繁琐

如果使用malloc,初始化操作会麻烦些:

如本题,则需要先将0行和0列初始化为0,再结合条件赋值1

若使用calloc,if(有障碍)后可写 dp[i][j]=0; 也可写continue; 还可以什么也不写 ; (有else时)

而使用malloc,此处只能写dp[i][j]=0;

malloc函数和calloc函数在刷LeetCode题时,十分方便!

注意:优先使用 malloc ,除非我们想要初始化为0,因为 malloc 比 calloc 快。所以,当我们只是想复制一些东西或者做一些不需要用0填充内存块的事情,那么malloc将是一个更好的选择。