C语言-动态内存及其函数

一.Windows下的内存分布

如图所示:基本要说的都在图上了
在这里插入图片描述

二.C语言动态内存函数

由于栈区的内存太小,很容易就把栈区挤爆了,所以需要在堆区申请内存来使用,如下的3个函数,都是从堆区来申请内存的,并且申请到的空间都没有初始化

  • 头文件<stdlib.h>

1.malloc函数

void* malloc(unsigned int size);//函数声明
int *p = (int *)malloc(size*sizeof(int));//基本用法

size代表了申请内存的字节数,是一个整型。返回值是void*类型,所以一般使用是如上述使用的,把它强转成所需要的类型

2.calloc函数

void* calloc(unsigned int count,unsigned int type_size);

count代表申请的个数,type_size代表1个所占的字节数,返回值还是void*。跟malloc不一样的是,这里弄成了个数和单个字节数,而malloc是总的字节数大小,一般都用的是malloc,calloc少用。

3.realloc函数

realloc又称扩容函数,是原先开辟的内存不够了,通过realloc再重新申请一段更大的内存空间

  • 这里对void*的理解是:任何指针都可以赋值给void*,意味着参数可以是任意类型的指针。
void* realloc(void* address,unsigned newsize);

address是原来申请的内存地址,newsize是现在申请的更大的内存的字节数

  • realloc函数的三种情况
    在这里插入图片描述
    第二种情况中,原先后面紧挨着的内存不够了,realloc会重新寻找另一段空间去分配
    在这里插入图片描述
    在这里插入图片描述
  • 鉴于第三种情况,一般会把申请到的空间给另一个指针,然后通过指针赋值给另外一个,避免申请失败,以前的指针变量也被赋值为空。

4.free函数

注意free的地址必须是动态申请的地址,还得是首地址

free(void* p);

5.初始化函数memset

头文件<string.h>

int* p = malloc(100);
memset(p,0,100);

p代表初始化的内存地址,0代表用0初始化,这里注意的是这里是按字节初始化的,也就是每个字节初始化为0,100代表初始化的大小(字节数)

6.动态内存开辟的使用范例

int* p = (int*)malloc(100*sizeof(int));
memset(p,0,100*sizeof(int));
int*q = (int*)realloc(p,200*sizeof(int));    //注意可能申请失败,则不希望原本的指针被赋值为空
if(q!=NULL)   q = p;
free(p);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lijiachang030718

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值