本帖最后由 你说呢 于 2015-7-18 17:23 编辑
内存管理:软件运行时对计算机内存资源的分配和使用的技术;
主要是对用户申请的内存空间的管理;系统运行申请的空间系统会自动回收,
内存空间:
BBS段:用来存放程序中未初始化的全局变量和静态变量
数据段:用来存放程序已经初始化的全局变量和静态变量,字符串常量 (常量区)
代码段:程序执行代码(编译后的代码)
堆:动态分配的内存单元 程序运行过程中申请的动态空间
栈:是用户存放程序临时创建的局部变量
常见的内存分配函数:
Malloc
使用方法:void *malloc(unsigned size) size是指的分配内存的字节
包含在stdlib.h中,作用是在内存的堆去分配一个大小为size的空间。
分配成功返回分配内存首地址 不成功返回NULL 单词null要大写
使用memset初始化
void * __cdecl memset(void *_Dst,int _Val,size_t _Size);
Calloc
calloc分配
格式:calloc(块数m,长度n)
分配m块长度为n的连续的内存空间 ,申请成功返回首地址否则NULL
会自动出自动初始化为0
Realloc
relloc 函数可以给已经存在的空间扩充大小
原先的空间不够会自动找新空间,并拷贝数据,返回新的内存空间的新地址
int *p =(int *)malloc(4*sizeof(int));
void *__cdecl realloc(void *_Memory,size_t _NewSize);
P=realloc(p,40*sizeof(int));//扩充空间为40个
野指针:
Int *p;定义了指针却没初始化; 申请了空间却没有指针指向,
内存泄露:
int *p=malloc (4*sizeof(int));
程序运完p所指的空间释放了 ,堆里申请的空间没释放造成内存泄露
解决办法:
在在被释放前,要释放堆中内存空间
free函数的使用
定义函数:
Void free(void *p);
free(p)
P=NULL;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void test(){
// 从内存中申请一块内存空间,可以存放4个整数
// 赋值要求等号的左右两侧的类型相等
// p中存放的是新申请的内存空间的首地址
// 注意malloc 申请的内存空间,如果不赋值,则是垃圾数
int *p =(int *)malloc(4*sizeof(int));
memset(p,'a',16);
if(p!=NULL){
// *p=10;
// *(p+1)=100;
// *(p+2)=1000;
// *(p+3)=10000;
}else{
printf("内存申请失败!\n");
}
for(int i=0;i<4;i++){
printf("%c\t",*(p+i));
}
}
void test2(){
// calloc分配
// 格式:calloc(块数,长度)
// 分配了4块,每一块内存长度为4的内存空间
// 地址是连续的
// 注意事项:可以初始化为0
int *p =(int *)calloc(4,sizeof(int));
if(p!=NULL){
*p=10;
*(p+1)=100;
*(p+2)=1000;
*(p+3)=10000;
}else{
printf("内存申请失败!\n");
}
for(int i=0;i<4;i++){
printf("%d\t",*(p+i));
}
}
int main(){
// relloc 函数可以给已经存在的空间扩充大小
// 返回新的内存空间的新地址
int *p =(int *)malloc(4*sizeof(int));
p=realloc(p,40*sizeof(int ));
if(p!=NULL){
*p=10;
*(p+1)=100;
*(p+2)=1000;
*(p+3)=10000;
*(p+39)=1111;
}else{
printf("内存申请失败!\n");
}
for(int i=0;i<40;i++){
printf("%d\t",*(p+i));
}
return 0;
} |
|