C进阶2:动态分配内存
2019-04-06 本文已影响0人
jdzhangxin
1. 动态分配内存是什么?
是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。通常我们的变量都是预先分配的,系统自动给分配和回收的。
2. 动态分配内存怎么用?
C99可以使用变量作为数组定义的大小,在C99之前只能使用动态分配内存实现。
int arr[n];
近似于
int* arr = (int*)malloc(n*sizeof(int));
// 操作arr如同操作int arr[n]
free(arr);
2.1 申请动态分配内存malloc()
stdlib.h
中定义函数void* malloc(size_t size)
,向系统申请大小为size
的内存空间。返回结果是void*
,使用时转换成需要的指针类型。如果申请失败,返回NULL
。
实例:获取系统最大可申请的空间
#include <stdio.h>
#include <stdlib.h>
int main(){
int cnt = 0;
while(void* p = malloc(100*1024*1024))
++cnt;
printf("%d00MB\n",cnt);
}
2.2 释放动态分配内存free()
free()
归还申请的内存。
出来混的,迟早要还的。
- 试一下,能否释放空指针?
free(NULL)
-
free()
的"坑"- 忘记
free()
。 - 修改了申请地址,然后
free()
。int* arr = (int*)malloc(n*sizeof(int)); free(arr+1);
- 多次
free()
。int* arr = (int*)malloc(n*sizeof(int)); free(arr); free(arr);
-
free()
非malloc
内存。int n = 0; free(&n);
- 忘记
指针悬空/野指针
2.3 初始化动态分配内存
试一下,申请的动态内存内的值是多少?
int* arr = (int*)malloc(n*sizeof(int));
for(int i=0;i<n;++i){
printf("arr[%d]=%d\n",i,arr[i]);
}
free(arr);
另外还有一个函数
int* arr = (int*)calloc(n,sizeof(int));
free(arr);
近似于
int arr[n] = {0};
申请到的内存不总是空的,通常需要初始化,可以使用如下方式。
int* arr = (int*)malloc(n*sizeof(int));
memset(arr,0,n*sizeof(int));
free(arr);
2.4 重新调整内存大小
void* realloc (void* ptr, size_t size);
- 如果当前内存段后面有足够的内存空间,那么就直接扩展这段内存,
realloc()
返回原来的首地址; - 如果当前内存段后面没有足够的内存空间,那么系统会重新向内存树申请一段合适的空间,并将原来空间里的数据块释放掉,而且
realloc()
会返回重新申请的堆空间的首地址; - 如果创建失败,返回
NULL
, 此时原来的指针依然有效;
2.5 内存分配函数小结
No. | 函数 | 作用 |
---|---|---|
1 | malloc() | 分配内存块,不初始化 |
2 | calloc() | 分配内存块,初始化为0
|
3 | realloc | 调整先前分配的内存块大小 |
4 | free | 释放分配内存块 |
2.6 标准库中相关函数
No. | 函数 | 作用 |
---|---|---|
1 | memset() | 填充内存 |
2 | memcpy() | 内存拷贝 |
3 | memmove() | 内存移动 |
4 | memcmp() | 内存比较 |
5 | memchr() | 查找内存中第一个出现指定字符的位置 |
这些函数通常要加上头文件stdlib.h
或者string.h
。
- 练习
从终端输入未知数量的数字,按键Ctrl+D作为结束,逆序输出输入的数字。