马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1. 动态内存分配
- int val = 20;//在栈空间上开辟四个字节
- char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
复制代码
- 空间开辟巨细是固定的。
- 数组在阐明时,必须指定命组长度,所需内存在编译时分配。
2. 动态内存函数的先容
2.1 malloc
- void* malloc (size_t size);
复制代码 动态内存开辟函数:
- 向内存申请一块一连可用的空间,返回指向这块空间的指针。
- 开辟乐成,则返回一个指向开辟好空间的指针。
- 开辟失败,则返回一个NULL指针,因此malloc的返回值肯定要做查抄。
返回范例是 void*,malloc函数并不知道开辟空间的范例,详细在使用的时间使用者自己来决定。
malloc申请到空间后,直接返回空间起始地点,不会初始化空间。
- #include <stdlib.h>
- int main() {
- int* p = (int*)malloc(40);
- if (p == NULL) {//检测malloc返回指针
- perror("malloc");
- return 1;
- }
- int i = 0;
- for (i = 0; i < 10; i++) {
- printf("%d\n", *(p + i));
- }
- free(p);//释放空间
- p = NULL;//p变成野指针,要置为空指针
- return 0;
- }
复制代码 2.2 free
malloc申请内存空间,不会主动开释内存,必要free开释。步调退出时会还给体系。
如果参数 ptr 是NULL指针,则函数什么事都不做。
2.3 calloc
- void* calloc (size_t num, size_t size);
复制代码
- 为 num 个巨细 为 size 的元素开辟一块空间,而且把空间的每个字节初始化为0。
- calloc 会在返回地点前,把申请的空间的每个字节初始化为全0。
- malloc申请到空间后,直接返回空间起始地点,不会初始化空间。
- #include <stdlib.h>
- int main() {
- int* p = (int*)calloc(10, sizeof(int));
- if (p == NULL) {//检测calloc返回指针
- perror("calloc");
- return 1;
- }
- int i = 0;
- for (i = 0; i < 10; i++) {
- printf("%d ", p[i]);
- }
- free(p);//释放空间
- p = NULL;//p置为空指针
- return 0;
- }
复制代码 0 0 0 0 0 0 0 0 0 0
2.4 realloc
- void* realloc (void* ptr, size_t size);
复制代码
- realloc 可以调解动态开辟内存巨细,返回调解后的内存位置
- ptr:必要调解的内存地点;size:调解后的新巨细
调解空间巨细的环境:
1.原有空间后有空间
- 原有内存后直接追加空间,原来空间的数据稳定
2.原有空间后没空间
- 在堆空间上另找一个符合巨细的一连空间来使用
- 会将原来内存中的数据移动到新的空间
- 开释旧空间,返回新空间内存地点
- int main() {
- int* p = (int*)malloc(40);
- if (p == NULL) {
- perror("calloc");
- return 1;
- }
- //初始化
- int i = 0;
- for (i = 0; i < 10; i++) {
- p[i] = i + 1;
- }
- //增加空间
- int* ptr = (int*)realloc(p, 80);
- if (ptr != NULL) {
- p = ptr;//如果扩展失败了,p被置为NULL,故不能直接使用p接受新指针,否则会内存泄漏
- }
- else {
- perror("realloc");
- return 1;
- }
- //打印数据
- for (i = 0; i < 20; i++) {
- printf("%d ", p[i]);
- }
- free(p);//释放空间
- p = NULL;//p置为空指针
- return 0;
- }
复制代码 1 2 3 4 5 6 7 8 9 10 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451
3. 动态内存错误
3.1 NULL指针解引用
- void test() {
- int *p = (int *)malloc(INT_MAX/4);
- *p = 20;//如果p的值是NULL,就会有问题
- free(p);
- }
复制代码 3.2 动态开辟空间越界访问
- int main() {
- int* p = (int*)malloc(40);//10个整形
- if (NULL == p){
- perror("malloc");
- return 1;
- }
- int i = 0;
- for (i = 0; i <= 20; i++){
- p[i] = i;//越界访问
- }
- free(p);
- p = NULL;
- return 0;
- }
复制代码 3.3 非动态开辟内存使用free开释
- int main() {
- int a = 10;
- int* p = &a;
- printf("%d\n", *p);
- //a不是动态开辟的
- free(p);
- p = NULL;
- return 0;
- }
复制代码 3.4 free开释动态开辟内存的一部门
- int main() {
- int* p = (int*)malloc(40);
- if (NULL == p){
- perror("malloc");
- return 1;
- }
- int i = 0;
- for (i = 0; i < 5; i++) {
- *p = i;
- p++;
- }
- free(p);//p已经不指向起始位置
- p = NULL;
- return 0;
- }
复制代码 3.5 同一块动态内存多次开释
- int main() {
- int* p = (int*)malloc(40);
- if (NULL == p) {
- perror("malloc");
- return 1;
- }
- free(p);
- free(p);//p多次释放
- p = NULL;
- return 0;
- }
复制代码 每次开释完p置空
3.6 动态开辟内存未开释(内存走漏)
- void test(){
- int* p = (int*)malloc(100);
- if (NULL != p){
- *p = 20;
- }
- }
- int main(){
- test();
- while (1);
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |