首页 > 系统相关 >14. 内存管理

14. 内存管理

时间:2023-03-11 12:33:35浏览次数:43  
标签:malloc 函数 管理 分配内存 内存 str 14 size

一、内存的组织方式

  程序员编写完程序之后,程序要先加载在计算机的内存中,再运行程序。在 C语言 中,不同数据在内存中所存储的位置也不一样。全局变量存储在内存中的静态存储区,非静态的局部变量存储在内存中的动态存储区(栈)。临时使用的数据建立动态内存分配区域,需要的时候开辟,不需要时及时释放(堆)。

  通过内存注释方式可以看出,堆用来存放动态分配内存空间,而栈用来存放局部数据变量、函数的参数以及调用函数与被调函数的联系。

  在内存的全局存储空间中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。在 C程序 中,使用 malloc() 函数和 free() 函数来从堆中动态的分配内存和释放内存。

  程序不会像处理堆那样在栈中显示地分配内存。当程序调用函数或声明局部变量时,系统将自动分配内存。

  栈是一个后进先出的压入弹出式的数据结构。在程序运行时,需要每次向栈中压入一个对象,然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最晚进栈的对象将被弹出,然后栈指针向上移动一个位置。如果栈指针位于栈顶,则表示栈是空的;如果栈指针指向最下面的数据项的后一个位置,则表示栈为满的。

二、动态管理

  在头文件 stdlib.h 中声明了四个有关内存动态分配的函数。

2.1、malloc()函数

  malloc() 函数的原型如下:

void* malloc( size_t size );

  该函数的作用是在内存中动态分配一个 size 大小的内存空间。malloc() 函数会返回一个指针,该指针指向分配的内存空间的第一个地址,如果出现错误,则返回 NULL。

  使用 malloc() 函数分配的内存空间是在堆中,而不是在栈中。因此在使用完这块内存中间之后一定要将其释放掉,释放内存空间使用的是 free() 函数。

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

int main()
{
    int *p;
    int i = 0;

    p = (int*)malloc(5*sizeof(int));

    printf("请输入5个整数:\n");
    for(i = 0;i < 5; i++)
    {
        scanf("%d",p+i);
    }

    printf("你输入的数据是:\n");
    for(i = 0; i < 5; i++)
    {
        printf("%d ",*(p+i));
    }

    free(p);

    return 0;
}

2.2、calloc()函数

  calloc() 函数的原型如下:

void* calloc( size_t num, size_t size );

  该函数的作用是在内存中动态分配 num 个长度为 size 的连续内存空间数组,并将该内存中间的字节初始化为0。calloc() 函数会返回一个指针,该指针指向动态分配的连续内存空间的起始地址。当分配内存空间错误是返回 NULL。

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

int main()
{
    char *str;

    str = (char*)calloc(30,sizeof(char));

    printf("请输入一个字符串:\n");
    gets(str);
    printf("你输入的字符串为:\n");
    printf("%s\n",str);

    free(str);

    return 0;
}

2.3、realloc()函数

  realloc() 函数的原型如下:

void *realloc( void *ptr, size_t new_size );

  该函数的作用是重新分配给定的内存区域。它重新分配 malloc() 函数 或 calloc() 函数 获得的动态空间大小,将 ptr 指向的动态空间大小改变为 new_size,ptr 的值不变。设定上 new_size 大小是任意的,也就是说既可以比原来的数值大,也可以比原来的数值小。返回值是一个指向新地址的指针,如果出现错误,则返回 NULL。

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

int main()
{
    char *str;

    str = (char*)malloc(30*sizeof(char));
    str = realloc(str,15*sizeof(char));

    free(str);

    return 0;
}

2.4、free()函数

  free() 函数的原型如下:

void free( void* ptr );

  该函数的作用是释放指针 ptr 指向的内存区,使部分内存区能被其它变量使用。ptr 是最近一次调用 calloc() 函数 或 malloc() 函数时的返回值。

三、动态分配内存的基本原则

  1. 避免分配大量的小内存块。分配堆上的内存有一些系统开销,所以分配许多小的内存块比分配几个大的内存块的系统开销大;
  2. 仅在需要时分配内存。只要使用完堆上的内存块,就需要及时释放它(如果使用动态分配内存,需要遵循谁分配,谁释放原则),否则可能出现内存泄露;
  3. 总是确保释放以分配过的内存。在编写分配内存的代码时,就需要确定在代码的什么地方释放内存;
  4. 在释放内存之前,确保不会无意中覆盖堆上已分配的内存地址,否则程序就会出现内存泄漏。在循环分配内存时,要特别小心。

标签:malloc,函数,管理,分配内存,内存,str,14,size
From: https://www.cnblogs.com/kurome/p/17205651.html

相关文章

  • 【MySQL-存储引擎,逻辑存储结构,内存,磁盘】
    目录:一、MySQL存储引擎二、InnoDB存储引擎1、InnoDB逻辑存储结构2、InnoDB架构3、InnoDB内存结构4、InnoDB磁盘结构一、MySQL存储引擎1、查看当前版本支持的存储引擎sho......
  • linux基础(4)--linux组管理
    1组的分类在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念。1.所有者——一个文件由谁创建的所有者就是谁,但文件的......
  • 关于Windows下-目录文件数量变化-造成资源管理器对cpu的高消耗问题分析
    今天笔者写了一个py脚本去处理Windows下一个目录Upload的文件,也就是将文件按照一些规则进行分类移动管理文件的数量近20万,笔者发现在处理过程中cpu几乎一直99%~100%,如下......
  • Vue————Vue v2.7.14 入口文件【二】
    前言按着我的习惯,拿到一个项目首先我会查看项目下的README.md其次查看package.json,这里也不例外看过README.md后,来看下package.json;GitHubgithubpage内容package.......
  • Vue——Vue v2.7.14 源码阅读之代码目录结构【一】
    前言这里主要说一些vue2.7.14源码的目录结构,其实这块有些目录并不重要,不过我还是想全面的描述下,详细的一些文件说明会随着源码解读来补充完善,其中描述如果有错的地方还......
  • HJ14 字符串排序
    描述给定n个字符串,请对n个字符串按照字典序排列。 数据范围: 1\len\le1000\1≤n≤1000  ,字符串长度满足 1\lelen\le100\1≤len≤100 输入描述:......
  • P1433 吃奶酪 标签: 动态规划,dp | 状态压缩
    详见:https://www.luogu.com.cn/problem/P1433就不写基础原理了,直接看注释吧点击打开非map版#include<iostream>#include<cstdio>#include<cmath>#include<alg......
  • 电脑提示vcomp140.dll丢失的解决方法
    电脑vcomp140.dll丢失怎么办?电脑vcomp140.dll文件丢失以后,电脑很多软件跟游戏都无法运行跟打开,它是系统重要的文件。怎么修复好相信困扰着不少小伙伴,小编今天就把教程分享给......
  • 推荐几款主流好用的远程终端连接管理软件
    一、介绍远程终端连接管理软件是管理服务器、虚拟机等远程计算机系统不可或缺的工具之一,它可以通过网络连接到另一台计算机,以执行命令、编辑文件或进行其他管理任务,下面我......
  • 笔记14
    考试十五分钟:1、编写代码实现功能tail-faccess.logf.seek()应用程序(文件对象/文件句柄1)应用程序(文件对象/文件句柄2)操作系统(真正的文......