动态内存的总结

目录

一.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置为空,防止多次释放程序崩溃
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部