C笔记 动态分配 malloc,free,calloc,realloc
来源:互联网 发布:淘宝代做课程设计 编辑:程序博客网 时间:2024/06/05 11:08
C语言中内存分配
1栈区
2堆区 手动分配释放,占操作系统80%内存。
3全局区或静态区
4字符常量区
5程序代码区
静态内存分配 动态内存分配
静态分配内存:
分配内存的大小是固定的,
- 很容易超出栈内存的最大值,
- 为了避免内存不足会开辟更多的内存,容易浪费内存
动态分配内存:
在程序运行过程中,动态指定需要使用的内存大小。类似java中的集合。
手动释放,释放之后这些内存还可以重新被使用。
1 动态指定数组的大小
void main(){ int len; printf("请输入数组的长度:"); scanf("%d",&len); int *p = malloc(1024*1024*10*sizeof(int)); //malloc和calloc相似 //int *p = calloc(1024*1024*10,sizeof(int)); int i = 0; for (;i<len;i++){ p[i] = rand() % 100; printf("%d,%#x\n",p[i],&p[i]); } //释放 free(p);}
当输入5以后,打印结果。
2 重新分配内存
void main(){ int len; printf("请输入数组的长度:"); scanf("%d", &len); int *p = malloc(len*sizeof(int)); int i = 0; for (; i < len; i++){ p[i] = rand() % 100; printf("%d,%#x\n", p[i], &p[i]); } int addlen; printf("请输入数组增加的长度:"); scanf("%d",&addlen); int *p2 = realloc(p,sizeof(int)*(len+addlen)); //重新赋值 i = 0; printf("====================\n"); for (;i<len+addlen;i++){ p2[i] = rand() % 200; printf("%d,%#x\n",p2[i],&p2[i]); } //手动释放内存 if (p!=NULL){ free(p); p = NULL; } if (p2!=NULL){ free(p); } getchar();}
重新分配内存的两种情况
缩小:缩小的那一部分数据会丢失
扩大:(连续的)
如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针
如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据释放掉。返回新的内存地址
如果申请失败,返回NUL,原来的指针仍然有效
内存分配的注意细节
- 不能多次释放释放
- 释放完之后(指针仍然有值),给指针置为NULL,标志释放完成
- 内存泄漏(p重新赋值之后,再free,并没有真正释放内存)
free(p)和p=NULL的区别
free(p)表示p指针所指向的内存被释放。
p=NULL 表示p不再指向之前的内存区域
内存泄漏问题
当指针没有释放,就重新赋值。会造成内存泄漏
void main(){ int *p = malloc(1024*1024*10*sizeof(int)); printf("%#x\n", p); //让指针p重新指向一个内存区域 p = malloc(1024 * 1024 * 10 * sizeof(int)*2); printf("%#x\n", p); free(p); p = NULL; getchar();}
重新前释放内存
void main(){ int *p = malloc(1024 * 1024 * 10 * sizeof(int)); free(p); p = NULL; //让指针p重新指向一个内存区域 p = malloc(1024 * 1024 * 10 * sizeof(int)* 2); free(p); p = NULL; getchar();}
阅读全文
0 0
- C笔记 动态分配 malloc,free,calloc,realloc
- c 内存动态分配 malloc free calloc realloc
- C_动态分配内存:malloc,realloc,calloc,free
- calloc(), malloc(), realloc(), free()
- malloc ? realloc ? free ? calloc ?
- malloc/realloc/calloc/free
- malloc ,calloc,free,realloc
- malloc,calloc,realloc,free
- malloc、calloc、realloc、free
- C++malloc,calloc,realloc,free函数
- 动态分配内存函数——calloc,free,malloc,realloc
- 动态分配malloc realloc free
- 动态分配内存 malloc、calloc、realloc
- calloc(), malloc(), realloc(), free()(转)
- malloc()、free()、calloc()与realloc()
- malloc()、free()、calloc() 與 realloc()
- calloc(), malloc(), realloc(), free(),alloca()
- alloca、calloc、malloc、realloc、free
- 编辑神器 Emmet
- SPPNet:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
- 2017上海金马五校程序设计竞赛 B:Sailing
- Axure的使用---原型图
- Moving Averages(3): How To Use Them
- C笔记 动态分配 malloc,free,calloc,realloc
- 有趣的汉语:同音文(二):《施氏食狮史》
- 2017 -金马五校程序设计竞赛-A
- 第一次使用Bootstrap
- CentOS、Ubuntu、Debian三个linux比较异同
- Linux进程池与线程池以及线程池的简单实现
- python基础学习之——格式化%——printf(“*%06d*\n”,x);是什么意思?
- Mac 添加用户级变量
- 有趣的汉语:同音文(三):《饥鸡集矶记》