C和指针之动态内存分配malloc、calloc、realloc简单使用和区别

1、介绍

3个函数都在<stdlib.h>头文件
1)、void* malloc(unsigned size);
在内存的动态存储区中分配一块长度为 size字节的连续区域,参数size为需要内存空间的长度, 返回该区域的首地址,这里我们需要主要如果申请失败返回 空指针
 
2)、void* realloc(void* ptr, unsigned newsize);  
给一个 已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度,地址可能会变
 
3)、void* calloc(size_t numElements, size_t sizeOfElement); 
参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,即在内存中申请numElements*sizeOfElement字节大小的连续地址空间
会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证 会被初始化为0
 
用完要记得释放内存
free(p);
p = NULL;
 
都在堆区分配内存,用完都需要释放,都是连续的分配内存
 
 
 
 

2、测试Demo

3个函数简单使用
#include <stdio.h>
#include <stdlib.h>

//malloc、realloc、calloc简单使用

int main()
{
    int *p1 = NULL;
    p1 = malloc(10 * sizeof(int));
    if (p1 != NULL)
    {
        //给p1赋值
        for (int i = 0; i < 10; ++i)
        {
             *(p1 + i) = 5;
        }
        //打印值
        for (int i = 0; i < 10; ++i)
        {
            printf("p1[%d] is %d\n", i, p1[i]);
        }
        free(p1);
        p1 = NULL;
    }
    int *p2 = NULL;
    p2 = calloc(5, sizeof(int));
    if (p2 != NULL)
    {
        for (int i = 0; i < 5; i++)
        {
            printf("p2[%d] is %d\n", i, p2[i]);
        }
        free(p2);
        p2 = NULL;
    }

    char *p3, *q4;
    p3 = (char *)malloc(5);
    q4 = p3;
    p3 = (char *)realloc(p3, 10)
    if (p3 != NULL)
    {
        printf("p3 is %p\n", p3);
        printf("q3 is %p\n", q4);
        p3 = (char *)realloc(p3, 1000);
        printf("p3 is %p\n", p3);
        free(p3);
        p3 = NULL;
    }
    return 0;
}

3、 运行结果

1111deMacBook-Pro:malloc a1111$ vim malloc.c
1111deMacBook-Pro:malloc a1111$ gcc -g malloc.c -o malloc
1111deMacBook-Pro:malloc a1111$ ./malloc
p1[0] is 5
p1[1] is 5
p1[2] is 5
p1[3] is 5
p1[4] is 5
p1[5] is 5
p1[6] is 5
p1[7] is 5
p1[8] is 5
p1[9] is 5
p2[0] is 0
p2[1] is 0
p2[2] is 0
p2[3] is 0
p2[4] is 0
p3 is 0x7ff323c01020
q3 is 0x7ff323c01020
p3 is 0x7ff323c03260

 
(0)

相关推荐

  • 一份通俗易懂的C语言内存总结

    C语言程序需要载入内存才可以运行,其不同的数据保存在不同的区域.所使用的内存可以分成两类:一类是静态存储区,另一类是动态存储区.C语言程序的存储区如下图所示: 1静态存储区 静态存储区分为三类:只读数 ...

  • C和指针之动态内存分配之编程练习4

    C和指针之动态内存分配之编程练习4

  • c++动态内存分配

    下面随笔是关于c++动态内存分配. 动态申请内存操作符 new new 类型名T(初始化参数列表) 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值. 结果值:成功:T类型 ...

  • 动态内存分配连续内存空间的二维数组

    可以直接使用一维数组来模拟二维数组,下面的代码就是在此基础上,用一个二级指针指向一维数组的相应地方,详见代码 #include <stdio.h> #include <malloc. ...

  • 【链表3】动态内存分配

    文/Edward 这一小节是为了讲述第2小节链表而做的只是铺垫.在9.2节中,我们通过一种非常朴素的方式来为大家展示了"链式"数据结构的基本方法,即,我们先定义好一个结构体存储类型 ...

  • 一文读懂 Linux 内存分配全过程

    在<你真的理解内存分配>一文中,我们介绍了 malloc 申请内存的原理,但其在内核怎么实现的呢?所以,本文主要分析在 Linux 内核中对堆内存分配的实现过程. 本文使用 Linux 2 ...

  • 解读各种内存分配函数的差别

    今天我们来讲讲几种容易混淆的内存分配函数的区别,它们分别是:SHGetMalloc, SHAlloc, CoGetMalloc, 和CoTaskMemAlloc. 让我们先从简单的开始吧. 首先,Co ...

  • 程序编译后运行时的内存分配

    一.编译时与运行时的内存情况 1.编译时不分配内存 编译时是不分配内存的.此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确.所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误 ...

  • 创业公司的动态股权分配机制part1

    每天一本书day284 创业公司的动态股权分配机制part1 这是一本好书,纯干货的工具书,带给我很多思考,需要带着理解能力去阅读,但如果能有生活的话理解将会事半功倍.目前也有的地方不理解,但是可以为 ...

  • 创业公司的动态股权分配机制part2

    每天一本书day285 创业公司的动态股权分配机制part2 今天的阅读又开始打起了瞌睡,看的是似懂非懂,因为超出了我的认知范围.越看越看不懂,看来动态股权分配机制是一个复杂的机制,但是掌握了相信一定 ...