内存管理
2015-12-23 20:52
162 查看
window.onload = function() {
dp.SyntaxHighlighter.ClipboardSwf = 'http://files.cnblogs.com/DreamZero/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
};
动态内存:通常当用户无法确定空间大小,或者空间太大,栈上无法分配时采用。
静态内存:在程序开始运行时有编译器分配的内存,在编译时完成,不占用CPU资源。
两者区别:
静态内存的分配是在程序开始编译时完成的,不占用CPU资源;而动态内存的分配是在程序运行时完成的,动态内存的分配与释放都是占用CPU资源的。 静态内存是在栈上分配的;动态内存是在堆上分配的。 动态内存分配需要指针和引用数据类型的支持,而静态内存不需要。 静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存的分配是在程序运行过程中,根据需要随时分配的,属于按需分配。 静态内存的控制权是交给编译器的,而动态内存的控制权是由自己决定的。
void *malloc(unsigned int size);
该函数的功能是分配长度为size字节的内存块。
如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。注意:当内存不再使用时,要使用free()函数释放内存块。
分配内存大小和返回指针类型都有自己决定。
void *calloc(unsigned n,unsigned size);
该函数的功能是在内存的动态区存储中分配n个长度为size的内存块。
分配结果和malloc()相同,也要用free释放。
void *realloc(void *mem_address,unsigned int newsize);
该函数的功能是改变原mem_adress所指向的内存区域的大小为newsize。
重新分配空间并将原空间内容复制过来,成功返回地址,否则返回NULL。
void *memset(void *s,char ch,unsigned n);
该函数功能是设置s中所有的字节为ch,s数组的大小为n。
注意:是按字节赋值
![](http://images2015.cnblogs.com/blog/736037/201512/736037-20151223205208234-397883998.png)
函数原型:
void free(void *memblock);
dp.SyntaxHighlighter.ClipboardSwf = 'http://files.cnblogs.com/DreamZero/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
};
动态内存:通常当用户无法确定空间大小,或者空间太大,栈上无法分配时采用。
静态内存:在程序开始运行时有编译器分配的内存,在编译时完成,不占用CPU资源。
两者区别:
静态内存的分配是在程序开始编译时完成的,不占用CPU资源;而动态内存的分配是在程序运行时完成的,动态内存的分配与释放都是占用CPU资源的。 静态内存是在栈上分配的;动态内存是在堆上分配的。 动态内存分配需要指针和引用数据类型的支持,而静态内存不需要。 静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存的分配是在程序运行过程中,根据需要随时分配的,属于按需分配。 静态内存的控制权是交给编译器的,而动态内存的控制权是由自己决定的。
分配内存
malloc()函数
函数原型:void *malloc(unsigned int size);
该函数的功能是分配长度为size字节的内存块。
如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。注意:当内存不再使用时,要使用free()函数释放内存块。
分配内存大小和返回指针类型都有自己决定。
#include<stdio.h> #include<stdlib.h> int main() { int* buffer; buffer = (int*)malloc(400); free(buffer); return 0; }
2.calloc()函数
函数原型:void *calloc(unsigned n,unsigned size);
该函数的功能是在内存的动态区存储中分配n个长度为size的内存块。
分配结果和malloc()相同,也要用free释放。
#include<stdio.h> #include<stdlib.h> int main() { int* buffer_m; int* buffer_c; int **buffer; int a[10]; buffer_m = (int *)malloc(20 * sizeof(int)); free(buffer_m); buffer_c = (int *)calloc(20, sizeof(int)); //和malloc效果相同 free(buffer_c); return 0; }
3.realloc()函数
函数原型:void *realloc(void *mem_address,unsigned int newsize);
该函数的功能是改变原mem_adress所指向的内存区域的大小为newsize。
重新分配空间并将原空间内容复制过来,成功返回地址,否则返回NULL。
4.memset()函数
函数原型为:void *memset(void *s,char ch,unsigned n);
该函数功能是设置s中所有的字节为ch,s数组的大小为n。
注意:是按字节赋值
#include<stdio.h> #include<stdlib.h> #include<string.h> void show(int *a,int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n----------\n"); } int main() { int a[10] = { 1,2,3,4,5 }; int i; memset(a, 0, sizeof(a)); //都赋值为0, show(&a,10); memset(a, -1, sizeof(a)); //都赋值为-1, show(&a, 10); memset(a, 1, sizeof(a)); //都赋值为1??? show(&a, 10); return 0; }
![](http://images2015.cnblogs.com/blog/736037/201512/736037-20151223205208234-397883998.png)
释放内存
动态申请内存一定要手动释放该内存空间。free()函数原型:
void free(void *memblock);
相关文章推荐
- input框自动填充内容背景颜色为黄色解决方法
- VS2012+OpenGL环境配置(win7)
- 自架http下载ipa注意事的几点
- poj 1007 dna逆序数
- ajax向后台传值
- 1086: [SCOI2005]王室联邦
- chrome跨域访问
- 使用fitness进行自动化测试
- STM32F103ZET6 之 ADC 采样率的确定
- 再谈协方差矩阵之主成分分析
- 关于图片放大和取得尺寸
- PAT乙级 到底买不买(20)
- struts <s:action>标签的用法
- 关于简单网站后台攻防技术
- 枚举的基本概念
- Jmeter资料收集
- Java虚拟机类加载和执行机制
- Android持久化存储SharedPreferences存储键值对的方式介绍
- 子集subset问题
- 今天遇到的i++问题之记录