动态申请内存的优势
在刷LeetCode的时候,经常需要定义数组,很多写法使用动态申请内存的写法,比如我要申请一个二维数组,动态申请内存的写法为:
int** nums = (int **)malloc(sizeof(int*)*m);
for(int i = 0; i < m; i++){
nums[i] = malloc(sizeof(int)*n);
}
我也可以这么写:
int nums[m][n];
既然可以这么简单的定义数组,为什么还要动态申请内存这么复杂的写法?动态分配,说简单点,就是在需要的时候,需要多少分配多少,不需要的时候释放掉。从这种说法就可以看出好处。跟花钱一样,省着花,不要的时候卖二手。如果以开始就把钱花完,万一哪天生病了急需钱,上哪里找啊。动态申请内存的特点有以下几点:
- 当你定义了一个指针,而且要往里面写数据时,必须要动态分配内存给他。
- 动态分配的内存在堆上,你有权利决定什么时候将他释放掉。
- 动态分配的内存请记得一定要释放掉,不然容易引起内存泄露。
- 栈上能分配的空间默认很小(1M)。使用动态申请的方法,可以再堆上申请比这个远远大得多的内存
切记一定不要忘记释放掉我们动态申请的内存:
free(nums);