前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态内存空间分配

动态内存空间分配

作者头像
pigeon
发布2022-04-11 19:47:58
6080
发布2022-04-11 19:47:58
举报
文章被收录于专栏:电子荣耀

动态内存空间分配

动态内存空间分配是指,在程序运行期间,根据实际需要向系统申请一定大小的内存空间,使用指针变量存储这块内存空间的地址,通过指针变量访问内存空间中的数据。变量使用完成后,要将动态申请到的内存空间归还给系统。

C语言对内存的动态分配是通过库函数实现的,主要有malloc,calloc、fe和 realloc 4个函数。这些函数在stdlib.h头文件中声明。

(1) malloc函数,其函数原型为:

void *malloc( unsigned int size)

其作用是向系统申请分配一个长度为size的连续内存空间。函数的返回值是内存空间的起始地址,如果未能成功分配到内存空间,则返回值为NULL。

(2) calloc函数,其函数原型为:

void *calloc(unsigned int n, unsigned int size)

其作用是向系统申请分配n个长度为size的连续内存空间。函数的返回值是内存空间的起始地址,如果未能成功分配到内存空间,则返回值为NULL。

(3)free函数,其函数原型为

void free(void *p)

其作用是释放指针变量p指向的内存空间,即将内存空间归还给系统,以便可以被程序中的其他部分使用,无返回值。指针变量p中的地址应该是使用malloc或calloc申请的内存空间的地址。

(4)realloc函数,其函数原型为:

void * realloc(void *p, unsigned int size)

其作用是对通过 malloc或calloc申请的内存空间进行重新分配,通常是为了改变原来申请内存空间的大小。参数p指向原来分配的内存空间,size表示重新分配的内存空间大小。

上面4个函数的参数和返回值使用了“void *”指针类型,该类型的指针变量存储一个“纯地址”,即只表示内存地址的编号,而不表示地址的类型。void类型指针与其他类型指针之间进行相互赋值时,无需强制类型转换,编译系统会自动进行转换。但习惯上,void指针赋值给其他类型指针时,使用强制类型转换。

动态申请内存空间时,通常使用运算符 sizeof计算不同类型的数据占用的字节数。

例如,动态分配存放10个int类型数据的内存空间,可以使用如下两种方式

int *p;

p=(int *) malloc(10*sizeof(int);//使用malloc函数分配

p=(int *) calloc(10,sizeof(int);//使用 calloc函数分配

程序中不再使用分配到的内存时,应该释放占用的内存空间,例如:

free(p);∥释放p指向的内存空间

例:利用动态数组存储多个考试成绩,输出其中不及格的成绩。

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int *list,*p,n;
    printf("输入考生人数:");
    scanf("%d",&n);
    list=(int *)calloc(n,sizeof(int));
    printf("输入[%d]个考生成绩:",n);
    for(p=list;p<list+n;p++)
        scanf("%d",p);
    printf("不及格的成绩有:");
    for(p=list;p<list+n;p++)
    {
        if(*p<)
            printf("%d ",*p);
    }
    printf("\n");
    return ;
}

程序运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子荣耀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档