zoukankan      html  css  js  c++  java
  • C语言 内存管理

    C语言 内存管理

    堆区内存分配和释放

    一、malloc 函数

    #include <stdlib.h>
    void *malloc(size_t size);

    功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。分配的内存空间内容不确定,一般使用memset初始化。

    参数:

    • size:需要分配内存大小(单位:字节)

    返回值:

    • 成功:分配空间的起始地址
    • 失败:NULL

    二、free 函数

    #include <stdlib.h>
    void free(void *ptr);

    功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。
    参数:

    • ptr:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。

    返回值:无

    三、案例

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    
    int main(void)
    {
        // 栈区大小 1M
        //int arr[210000] = {0};
    
        // 1、开辟堆空间存储数据
        // int* p (强制转换的类型*)malloc(sizeof(开辟类型大小));
        int* p = (int*)malloc(sizeof(int));
        
        // 2、使用堆空间
        *p = 123;
        printf("%d
    ", *p);
    
        // 3、释放堆空间
        free(p);
        // 避免野指针出现
        // p = NULL;
    
        // 查看内存地址、p为野指针
        printf("%p
    ", p);
    
        // 操作野指针、释放后再次使用堆空间
        *p = 123;
        printf("%d
    ", *p);
    
        return 0;
    }
    堆空间 使用案例
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    
    int main(void)
    {
        
        // 开辟堆内存空间
        int* p = (int*)malloc(sizeof(int) * 10);
    
        // 判断p内存是否开辟成功
        if (!p)
        {
            printf("程序异常");
            return -1;
        }
    
        // 通过指针存储操作堆空间
        for (int i = 0; i < 10; i++)
        {
            p[i] = i;
        }
    
        // 输出堆空间内容
        for (int i = 0; i < 10; i++)
        {
            printf("%d
    ", *(p + i));
        }
    
        // 释放内存
        free(p);
    
        return 0;
    }
    堆空间 使用案例:2
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #define MAX 10
    
    int main(void)
    {
        // 通过堆内存、创建随机数
        srand((size_t)time(NULL));
        // 如果指针改变该堆内存则变为无主空间
        int* p = (int*)malloc(sizeof(int) * MAX);
    
        for (size_t i = 0; i < MAX; i++)
        {
            p[i] = rand() % 100;
            printf("%d
    ", p[i]);
        }
    
        for (size_t i = 0; i < MAX; i++)
        {
            printf("%d
    ", p[i]);
            // p++;
        }
    
        // 如p++改变指针地址free则无法释放内存
        free(p);
    
        return 0;
    }
    堆空间 使用案例:堆空间存储数据注意
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    
    int main(void)
    {
        // 二级指针开放堆空间存储一级指针的内存地址
        // int arr[5][3]
        int** p = (int**)malloc(sizeof(int*) * 5);
    
        // 开辟一级指针对应的堆空间
        for (int i = 0; i < 5; i++)
        {
            // 通过二级指针、开辟一级指针对应堆空间
            p[i] = (int*)malloc(sizeof(int) * 3);
        }
    
        // 赋值
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                scanf("%d", &p[i][j]);
            }
        }
    
        // 打印
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                // printf("%d", p[i][j]);
                // printf("%d", *(p[i]+j));
                printf("%d", *(*(p+i)+j));
            }
            printf("
    ");
        }
    
        for (int i = 0; i < 5; i++)
        {
            // 释放一级指针堆空间
            free(p[i]);
        }
    
        // 释放二级指针堆空间
        free(p);
    
        return 0;
    }
    堆空间 使用案例:二级指针开辟堆空间
  • 相关阅读:
    外校培训前三节课知识集合纲要(我才不会告诉你我前两节只是单纯的忘了)
    floyd算法----牛栏
    bfs开始--马的遍历
    (DP 线性DP 递推) leetcode 64. Minimum Path Sum
    (DP 线性DP 递推) leetcode 63. Unique Paths II
    (DP 线性DP 递推) leetcode 62. Unique Paths
    (DP 背包) leetcode 198. House Robber
    (贪心 复习) leetcode 1007. Minimum Domino Rotations For Equal Row
    (贪心) leetcode 452. Minimum Number of Arrows to Burst Balloons
    (字符串 栈) leetcode 921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/12379881.html
Copyright © 2011-2022 走看看