malloc

来源:互联网 发布:找谱子的软件 编辑:程序博客网 时间:2024/06/05 18:43

malloc(memory allocation 动态分配内存)

在Ubuntu下查看malloc的用法:

这里写图片描述
(1)malloc的头文件:# include < stdlib.h >
(2)malloc函数如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。因此我们需要判断malloc申请是否成功!
(3)malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。因此我们需要对这块内存进行清空处理

堆内存的申请

堆内存也是内存的一种,需要程序员自己手动申请malloc,手动释放
编译器不会自动回收,申请的内存伴随整个程序。

堆内存的释放

整个程序结束,会自动释放堆内存。
申请一次,释放一次,不可以多次释放。
释放的堆内存必须是这块内存的首地址。


malloc调用实例(动态数组的输入)

#include<stdio.h>#include<string.h>#include<stdlib.h>int set_value(int *p, int lenth){    int i = 0;    printf("请输入各个元素的值:\n");     for(i=0;i<lenth;i++)    {        scanf("%d",&p[i]);    }} int main(void){    int a = 0;    printf("请输入数组的元素个数:\n");    scanf("%d",&a);    //malloc的返回值是void*类型的,因为它并不知道你要存放什么样的数据。     //申请一定大小的堆内存,堆内存中存放的数据是int型的,所以强制类型转化!     int *p = (int *)malloc(a*sizeof(int));    //判断malloc是否申请成功    if(NULL == p)    {        printf("malloc failed");        return -1;    }    //清空申请到的这个内存    memset(p,0,a*sizeof(int));    //清空就可以使用这块内存了!    set_value(p,a);    //释放内存    free(p);    //避免野指针的出现,将指针写0     p = NULL;    return 0; } 

malloc
(1)申请(申请的大小,存放的数据类型(强制类型转化))
(2)判断是否申请成功
(3)申请成功之后对内存进行清空
(4)使用这块内存
(5)free释放内存(虽然这个内存会在这个进程结束自动释放,但是我们现在写的main函数比较短,如果是一直运行的程序,程序员忘记释放内存,会导致内存泄漏。)
(6)避免野指针的出现,我们对指针进行写0的操作。


c++下面的new和del是成对使用的
new是一个运算符,跟sizeof是一样的。

new int
创建一个int类型的数据
new int(0)
创建一个初始化的数据
new int【10】
创建10个int数据的数组
new string【10】
创建10个字符串类型的数据


malloc和new的区别

(1)是否需要指定要分配的内存的大小

new返回指定类型的指针,并自动计算大小,例如:下面的new返回的指针类型为int *,分配的内存空间的大小为sizeof(int)。
int *p = new int

malloc则必须由我们计算分配的字节数,并且在返回后还要把指针强制转换为实际的类型
int * p = (int *)malloc(sizeof(int))

(2)是否会对分配的内存进行初始化

malloc只负责分配内存,并不能对分配的内存进行初始化,但是new可以对分配的内存进行初始化。

(3)malloc(free)是函数 而 new(del)是运算符

原创粉丝点击