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将是一个更好的选择。