动态内存的总结
目录
一.malloc函数开辟动态存储区
二.calloc函数开辟动态存储区
三.realloc函数重新分配动态存储区
四.free发生崩溃的原因
五.memset函数
六.动态内存申请释放的流程
在C语言中我们开辟内存空间有两种方式:1.静态内存开辟2.动态内存开辟
静态内存开辟 动态内存开辟 位置 栈 堆 内存大小 固定 不固定 内存的释放 系统释放 程序员释放
一.malloc函数开辟动态存储区
函数原型:void*malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间。形参size的类型定位无符号整形(不允许为负数)。此函数的值(即“返回值”)是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的第一个字节。如:
malloc(100);
注意指针的基类型为void,即不指向任何类型的数据,只提供一个纯地址。如果此函数未能成功地执行(例如内存空间不足),则返回空指针。
——摘自《C语言程序设计》
头文件为:
malloc函数未进行初始化。需要进行初始化,可用memset进行初始化。
#include
#include
#include
#includeint main(){
int*p=(int*)malloc(sizeof(int)*10);
assert(p!=NULL);//p==NULL内存开辟失败
memset(p,0,10*sizeof(int));
for(int i=0;i<10;i++){printf("%5d",p[i]);}
free(p);//释放p
p=NULL;//p置为空,防止多次释放程序崩溃
}
二.calloc函数开辟动态存储区
函数原型:void*calloc(unsigned n,unsigned size);
其作用是在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。
用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向所分配域的第一个字节的指针;如果分配不成功,返回NULL。如:
p=calloc(50,4);
——摘自《C语言程序设计》
可以看做mallco和初始化结合
#include
#include
#include
#includeint main(){
int*p=(int*)calloc(sizeof(int)*10);
assert(p!=NULL);//p==NULL内存开辟失败
for(int i=0;i<10;i++){printf("%5d",p[i]);}
free(p);//释放p
p=NULL;//p置为空,防止多次释放程序崩溃
}
三.realloc函数重新分配动态存储区
函数原型:void*realloc(void*p,unsigned int size);
如果已经通过malloc函数或者calloc函数获得了动态空间,想改变其大小,可以用realloc函数重新分配。
用realloc函数将p所指向的动态空间的大小改变为size。p的值不变。如果重新分配不成功,返回NULL。如:
realloc(p,50);
——摘自《C语言程序设计》
realloc扩容:在已有的堆内存基础上进行扩容
#include
#include
#include
#incldue
int main(){
int*p=(int*)malloc(100);//100个字节初始化
assert(p!=NULL);
memset(p,0,100);
int*q=(int*)realloc(p,200);
assert(q!=NULL);
if(q=NULL){
free(p);
p=NULL;
exit(EXIT_FAILURE);
}
else{p=q;
}
free(p);//释放内存
p=NULL;
}

四.free发生崩溃的原因
1.连续多次释放内存
int*p=(int*)malloc(100);free(p);//p此时为野指针free(p);//崩
2.free(野指针);//崩
3.free必须和malloc,calloc,realloc搭配使用
int a=0;
int*p=&a;
free(p);//崩
堆栈不要混
4.free(NULL);不会崩
五.memset函数
memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。
memset(void*,int value,size_t size);
void* :初始化内存
int value :要被设置的值
size_t size :size个字节
注意所要赋值的数组的元素类型
1.对char类型的数组a初始化,设置元素全为‘1’
输出结果全为 1
2.对int类型的数组a初始化,设置元素全为‘1’
输出结果 16843009 16843009 16843009 16843009
说明:
在1中字符型占据内存大小就是一字节,memset函数也是以字节为单位进行赋值的;
在2中,数组a为整型占据四个字节,所以对于啊[0]来说,其值为(00000001 00000001 00000001 00000001),即十进制的16843009.
六.动态内存申请释放的流程
#include
#include
#include
#includeint main(){
int*p=(int*)malloc(sizeof(int)*10);
assert(p!=NULL);//p==NULL内存开辟失败
for(int i=0;i<10;i++){printf("%5d",p[i]);}
free(p);//释放p
p=NULL;//p置为空,防止多次释放程序崩溃
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
