10_动态内存

动态内存

动态分配和静态分配

动态分配:

  1. 在程序运行中, 根据需要自动分配所需空间

  2. 分配在堆区, 一般使用特定函数进行分配

静态分配:

  	1. 按事先规定大小分配内存空间, 如: int a[10]
  	2. 分配在栈区或全局变量区

动态内存申请的API

malloc 申请 堆区空间

#include<stdlib.h>
void * malloc(size_t size); //size 表示申请的空间字节数
函数的返回值:
	成功: 返回空间起始地址
    失败: NULL

特点: malloc 申请的堆区空间 不自动清0

申请int空间

int *p = NULL;
    p = (int *)malloc(sizeof(int));
    if (p == NULL)
    {
        return;
    }
    *p = 100;
    printf("%d\n", *p);

free释放堆区空间

#include<stdlib.h>
void free(void *ptr); //ptr需要释放的堆区空间的起始地址
free(p); //p的权限不只是属于该进程, 可以由cpu自由分配, 内容不一定清0

memset内存设置函数

#include<string.h>
void *memset(void *s, int c, size_t n);
s: 空间的起始地址
c: 空间中每个字节填充的值
n: 空间的字节大小

例: 动态数组

int n = 0;
    printf("请输入int元素的个数:");
    scanf("%d", &n);

    //根据元素个数申请空间
    int *p = NULL;
    p = (int *)malloc(n*sizeof(int));
    if (p == NULL)
    {
        return;
    }
    //将堆区空间清0
    memset(p, 0, n*sizeof(int));

    //获取键盘输入
    for (int i = 0; i < n; i++)
    {
        scanf("%d", p + i);
    }

    //遍历数组元素
    for (int i = 0; i < n; i++)
    {
        printf("%d ", p[i]);
    }
    printf("\n");

calloc函数

#include<stdlib.h>
void *calloc(size_t nmemb, size_t size);
nmemb: 内存的块数
size: 每一块的字节数
返回值:
	成功:堆区空间起始地址
    失败: NULL
calloc会对申请的空间 自动清0       
int n = 0;
    printf("请输入int元素的个数:");
    scanf("%d", &n);

    //根据元素个数 申请空间
    int *p = NULL;
    p = (int *)calloc(n, sizeof(int));
    if (p == NULL)
    {
        return ;
    }
    //获取键盘输入
    for (int i = 0; i < n; i++)
    {
        scanf("%d", p+i);
    }
    for (int i = 0; i < n; i++)
    {
        printf("%d ", p[i]);
    }
    printf("\n");

realloc函数 追加空间

#include <stdlib.h>
void *realloc(void *ptr, size_t size);
ptr: 旧空间起始地址
size: 旧空间和新空间之和
返回值: 空间起始地址

image-20230731223207179

image-20230731223320613

printf("请输入添加新空间个数: ");
    scanf("%d", &n2);
    p = (int *)realloc(p, (n + n2)*sizeof(int));
    inputAndOutput(p, n, n+n2);

内存泄漏

image-20230731232723337

image-20230731234102016

解决方案: free(p);

案例2:

image-20230801155827866

解决方案: free(q);

释放free本质功能: 回收空间专属权限

image-20230801162130288

posted @ 2023-08-01 16:22  爱吃冰激凌的黄某某  阅读(6)  评论(0编辑  收藏  举报