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

简介: 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


相关文章
|
2月前
|
存储 缓存 资源调度
阿里云服务器经济型、通用算力型、计算型、通用型、内存型实例区别与选择指南
在我们通过阿里云的活动选购云服务器的时候会发现,相同配置的云服务器往往有多个不同的实例可选,而且价格差别也比较大,这会是因为不同实例规格的由于采用的处理器不同,底层架构也有所不同(例如X86 计算架构与Arm 计算架构),因此不同实例的云服务器其性能与适用场景是有所不同。本文将详细解析阿里云的经济型、通用算力型、计算型、通用型和内存型实例的性能特点及适用场景,帮助用户根据自己的业务需求做出明智的选择。
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
267 13
|
3月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
90 11
|
3月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
3月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
3月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
2月前
|
存储 数据可视化 C++
第九问:能否尽可能详细阐述指针和引用的区别?
在C++中,指针和引用是两个重要的概念,用于操作内存地址和数据。指针是一个存储内存地址的变量,可以动态分配和释放内存;引用是变量的别名,绑定后不可改变指向。指针提供更大的灵活性和控制力,适用于复杂内存操作;引用更直观,适合简化代码并提高可读性。根据实际需求选择合适的工具。
46 0
|
3月前
|
存储 缓存 安全
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
4月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
4月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。