黑马程序员——C语言--常见的内存分配函数

本文介绍了为何需要动态内存分配,并详细解析了C语言中三种动态内存分配函数:malloc、calloc及realloc的功能与用法,帮助读者掌握高效内存管理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

1.为什么要进行动态内存分配?
       以数组为例,一个数组的元素是存储于内存中一段连续的空间,当数组声明在其被编译的时候内存就已经分配了。但是这种静态分配内存的方式在很多情况下是不合理的,例如使用数组存储一个班级中所有的学生的成绩,由于不同班级的学生数量也是各异的,所以你将无法推测应该给数组分配多大的内存。一般都是按照容纳可能出现的最大数量来分配的。这样如果程序需要使用的数量超过声明的,这时候怎么办呢?
       解决这个问题往往是采用把数组声明的更大一些,但如果程序实际需要的元素数量比较少时,就会造成内存空间的浪费,所以动态分配内存十分的必要。
2.常见的动态分配内存函数
C语言中提供了三个动态分配函数:malloc,calloc和realloc。
1)malloc
       格式:void *malloc(unsigned size),其中size指的是内存分配的字节数。
       void *malloc(unsighed size), 包含在库函数stdlib.h中,作用是在内存的堆区分配一个大小为size的连续空间,如果内存分配成功,函数返回新分配内存的首地址,否则返回NULL。所以需注意,在写程序时需判断一下内存是否分配成功。如下面程序:
<span style="font-size:18px;">int *p;
p=(int *)malloc(sizeof(int));
if(p!=NULL)
............................//需要执行的语句
else
............................//打印分配内存不成功出错信息</span>

       malloc函数所分配的是一块连续的内存。

          注意:malloc函数申请的内存空间,如果不赋值,内存空间内存的都是垃圾数。

       可以使用memset函数给malloc申请的空间进行初始化。定义函数:void * memset(void *s,int c,size_t n);  说明:memset()会将参数s所指的内存区域前n个字节以参数c填入,然后返回指向s的指针。返回值是指向s的指针。

       例如程序:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {
    int *p,i;
    p=(int *)malloc(sizeof(int)*100);
    for (i=0; i<100; i++) {
        printf("%d\t",*(p+i));
        if(i%8==0) printf("\n");
    }
    printf("\n");
    free(p);
    return 0;
}
       运行结果将有非零数。

2)calloc

       格式 :calloc(块数,长度),如calloc(4,sizeof(int));语句实现分配4块内存长度为4的内存空间。这些内存空间的地址也是连续的。

       注意:calloc函数自动将申请的内存空间赋值为0。

       例如程序:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {
    int *p,i;
    p=(int *)calloc(100,sizeof(int));
    for (i=0; i<100; i++) {
        printf("%d\t",*(p+i));
        if(i%8==0) printf("\n");
    }
    printf("\n");
    free(p);
    return 0;
}
         运行结果全为0。

3)realloc

       格式:void *realloc(void *str,unsigned size),将str所指的已分配内存区的大小改为size,size可以比原来分配的内存空间小或大,如果重新分配内存成功则返回指向被分配内存的指针,否则返回空指针NULL。realloc可以对给定的指针所指的空间进行扩大或者缩小,原来内存中的内容将保持不变。当然如果缩小,被缩小的那一部分的内容会丢失。

       注意:realloc并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc返回的指针很可能指向的一个新的地址。所以在代码中,我们必须将realloc返回的值重新赋值给一个指针变量。还需要注意的是,当内存分配成功后应将原来的指针赋值NULL,否则会形成野指针,可能会造成系统崩溃。




       提示:不论是以上哪种方式申请内存,在使用完之后,都需要用free()函数将内存空间释放,以免造成内存泄漏。

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值