C语言和C++申请内存案例

本文详细介绍了C++中的内存申请方法,包括malloc、calloc、realloc和new关键字的使用示例,以及内存释放的注意事项。

malloc 内存申请案例

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

int main(int argc, char const *argv[])
{
    /*
    void * malloc(size_t size)
    size_t ==> unsigned long无符号长整型,仅支持正数使用
    malloc 函数接受一个参数 size,表示需要分配的字节数
    分配成功返回一个指向分配内存的指针;如果分配失败,返回 NULL。
    void * 万能指针,可以指向任何一个空间首地址,但是系统要求,不可以通过
    void * 访问读取目标空间中数据内容。在使用时需要进行【强制类型转换】,
    明确告知当前指针对应数据空间,按照哪一个类型进行处理。
    */
   //当前操作只是向 CPU 申请内存堆区空间,要求空间字节数为 40 个字节
    void *p = malloc(40);
    // 强制类型转换,告知 CPU当前 p 对应的地址按照 int 类型数据处理方式
    int *p1 = (int *)p;

    /*
    通过 p1 操作申请的空间,CPU 通过
     p1 操作的对应空间每一个元素都是 int 类型 
    */
    for (int i = 0; i < 40 / sizeof(int); i++)
    {
        //1.指针方式操作
        //*(p1 + i) = i * 2;
        //2.数组方式操作
        p1[i] = i * 2;
    }

    for (int i = 0; i < 40 / sizeof(int); i++)
    {
        // 方式一: 可以按照指针形式进行操作
        // printf("*(p2 + %d) = %d\n", i, *(p2 + i));

        // 方式二: 可以按照数组形式进行操作,当前指针形式,数组的存储数据类型为 int 类型
        printf("p1[%d] = %d\n", i, p1[i]);
    }

    printf("p = %p\n", p);
    printf("p1 = %p\n", p1);

    /*
    void free(void* ptr);
        free 函数是用于释放 malloc realloc calloc 申请的内存空间,需要提供给当前
        函数申请空间的【首地址】,所需参数是 void * 类型,在实际使用中,可以提供任意类型
        指针。

        free 操作将 p2 指向内存空间进行释放操作,告知系统当前内存使用完毕,可以其他程序
        申请。
    */
    free (p);

    /*
    p 和 p2 原本都存储申请空间首地址,但是对应空间已经通过 free 释放
    归还给系统,为了安全操作不可以通过 p 和 p2 访问原本的数据空间,重新
    赋值为 NULL,防止后期使用。
    */
   p = NULL;
   p1 = NULL;
    return 0;
}

calloc内存申请案例 

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

int main(int argc, char const *argv[])
{
    /*
    calloc 案例
    void *calloc (size_t_num, size_t_size);
    通过 calloc 函数申请内存【堆区空间】, 要求申请的每一个元素
    占用内存 4 个字节,总计内存 40 个字节
    同时将当前申请的内存空间首地址,强转为 int 类型,
    CPU 通过 p 操作对应内存空间,每一个元素都是 int 类型
    */
    int *p = (int *)calloc(10, sizeof(int));

    for (int i = 0; i < 10; i++)
    {
        p[i] = i + 1;
    }

    for (int i = 0; i < 10; i++)
    {
        printf("p[%d] = %d\n",i , p[i]);
    }
    
    //释放空间
    free(p);
    //擦除数据
    p = NULL;
    return 0;
}

reaclloc 内存申请案例 

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

int main(int argc, char const *argv[])
{
    // malloc 申请 40 个字节空间数据
    int *p = (int *)malloc(10 * sizeof(int));
    printf("p = %p\n", p);

    for (int i = 0; i < 10; i++)
    {
        *(p + i) = i * 2;
    }

    for (int i = 0; i < 10; i++)
    {
        printf("*(p + %d) = %d\n", i, *(p + i));
    }

    /*
    void * realloc (void *ptr, size_t_size);
    ptr 是需要提供给当前函数通过 malloc calloc realloc 申请
    的内存空间的首地址, size 是当前重新分配空间对应的空间字节数
    返回值是新空间首地址
        1.地址不变
        2.地址改变
    【必须使用原本存储空间的首地址的指针变量,接受 realloc 返回值】
    */
    p = (int *)realloc(p, 60);

    printf("p = %p\n", p);

    for (int i = 0; i < 15; i++)
    {
        printf("*(p + %d) = %d\n", i, *(p + i));
    }

    free(p);
    p = NULL;
    return 0;
}

C++内存申请案例 

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

int main(int argc, char const *argv[])
{
    //C语言 calloc 申请内存空间
    int *arr = (int *)calloc(10, sizeof(int));

    //释放函数
    free(arr);
    arr = NULL;

    //C++ 内存申请空间, 数据类型 变量名 = new 数据类型
    int *new_arr = new int[10];
    //进行擦除操作,避免野值问题
    memset(new_arr,0,sizeof(int));

    for (int i = 0; i < 10; i++)
    {
        new_arr[i] = i*2;
    }

    for (int i = 0; i < 10; i++)
    {
        cout << "new_arr[" << i << "]" << new_arr[i] << endl;
    }
        
    delete new_arr;
    return 0;
}

今天的分享到此结束啦!! 我们下期再见!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iot_Ming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值