Linux环境内存管理——分配内存和释放内存

news2024/9/29 18:07:19

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows程序员如何学习Linux环境内存管理。由于很多程序在Windows环境下开发好后,还要部署到Linux服务器上去,所以作为Windows程序员有必要学习Linux环境的内存管理知识。

通过大学的编程基础学习,相信大家已经了解到静态内存主要针对程序中的各种变量,当在程序中定义变量时,编译器就为其分配了内存,当变量的作用域结束时,会自动释放该变量所在的内存。由此看来,静态内存的分配与释放都不需要程序员规定,因此也就无须考虑内存的管理问题;而动态内存的分配与释放完全由程序员自行决定,因此有很多需要考虑的内存管理方面的操作。下面就介绍关于动态内存管理的基本操作。

分配内存

计算机的内存空间都是通过指针进行访问的,而指针对于正确地分配动态内存空间来说又是十分重要的。关于动态内存的分配所使用的操作函数,在这里主要介绍malloc()、calloc()、realloc()和memset()函数的基本用法。

1. malloc()函数

函数原型为:

void *malloc(unsigned int size);

该函数的功能是分配长度为size字节的内存块。

如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。当内存不再使用时,要使用 free()函数释放内存块。例如,使用 malloc()函数获得一块内存空间,内存空间的大小与返回的指针类型由程序员根据需要自行规定,代码如下:

void main()
{
   long* buffer;
  buffer =(long*)malloc(500);    /获得一块长整型数组空间
  free(buffer);    /释放内存空间
}

2. calloc()函数

函数原型为:

void *calloc(unsigned n,unsigned size);

该函数的功能是在内存的动态区存储中分配n个长度为size的内存块。

如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。同样,在内存不再使用时要用free(函数释放内存块。

用calloc()函数可以为一维数组开辟动态存储空间,n为数组元素的个数,每个元素长度为size。

例如,使用 calloc()函数获得一块长整型数组空间,代码如下:

void main()
{
  long*  buffer;
  buffer =(long *)calloc(100,sizeof(long));       //获得一块长整型数组空间
  free(buffer);        //释放内存空间
}

3. realloc()函数

函数原型为:

void *realloc(void *mem_address,unsigned int newsize);

该函数的功能是调整 mem_address所指内存区域的大小为 newsize长度。

如果重新分配内存成功,则返回指向被分配内存的指针;否则返回空指针NULL。同样,当内存不再使用时,应用free()函数将内存空间释放。

当参数 mem_address 指向 NULL时,即调整空指针所指向的内存区域的大小为 newsize长度,此时 realloc()函数的功能与malloc()函数相同。若参数 newsize为0,即要调整成的长度为0时, realloc()函数所实现的功能就相当于free()函数,释放掉该内存区块。

可以用VI编辑器中编写一个简单的C语言程序test.c,利用realloc()函数重新分配一块内存空间。程序的代码如下:

#include<stdlib.h>
#include<stdio.h>
main()
{
   char *p;
   p=(char*)malloc(100);     /*为指针p开辟一个内存空间*/
  if(p)       /*判断内存分配成功与否*/
      printf("内存分配情况如下: %x",p);
   else
      printf("内存无法分配\n");
   getchar();
   p=(char*)realloc(p,256);      /*调整p内存空间从100字节到256字节*/
   if(p)
      printf("内存重新分配情况如下: %x",p);
   else
      printf("内存无法分配\n");
   free(p);       /*释放p所指向的内存空间*/
   getchar();
   return 0;
}

程序的运行效果如所示。

$ gcc -o test test.c

$./test

内存分配情况如下: 2df58010

内存重新分配情况如下: 2df588a0

$

4. memset()函数

函数原型为:

void *memset(void *s, char ch,unsigned n);

该函数的功能是设置s中的所有字节为ch,s数组的大小为n。

可以用VI编辑器中编写一个简单的C语言程序test.c,利用memset()函数的功能,用字符“*”替换数组s中的字符串。

#include<string.h>
#include<stdio.h>
int main(void)
{
  char s[]="welcome to microsoft\n";      /*定义一个字符数组s*/
  printf("输出原来的字符:%s\n",s);    /*输出字符数组中的内容*/
  memset(s,'a',strlen(s)-1);         /*设置s数组中的字符串内容为“a”*/
  printf("输出之后的字符:%s\n",s);      /*输出此时的字符数组内容*/
   return 0;
}

程序在Linux系统中的运行效果如下所示。

$ gcc -o test test.c

$ . /test

输出原来的字符: welcome to microsoft

输出之后的字符: aaaaaaaaaaaaaaaaaaaa

$

释放内存

通过 malloc()、calloc()和 realloc()函数分配完动态内存后,在程序中可以使用这些内存空间,在使用完动态内存后,一定要使用free()函数释放掉该块内存空间,以免造成内存泄露等问题。当释放掉内存后,原来指向内存空间的指针就会变成悬空的指针,这时再使用该指针时就会发生错误。

free()函数的原型为:

void free( void *memblock);

参数memblock表示要被释放的内存区块。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IntelliJ IDEA 实用插件推荐(包含使用教程)

IntelliJ IDEA 实用插件推荐 背景&#xff1a;电脑重装了&#xff0c;重新下载了最新版的IntelliJ IDEA&#xff0c;感觉默认模式有点枯燥&#xff0c;于是决定从网上下载一些实用美观的插件优化自己以后吃饭的工具&#xff0c;现在推荐的都是目前还能用的&#xff08;亲身实践…

【java】Java 内存模型

文章目录前言什么是 Java 内存模型为什么需要 Java 内存模型顺序一致性内存模型Happens-Before 规则总结前言 在并发编程中&#xff0c;当多个线程同时访问同一个共享的可变变量时&#xff0c;会产生不确定的结果&#xff0c;所以要编写线程安全的代码&#xff0c;其本质上是对…

C语言青蛙跳台阶【图文详解】

青蛙跳台阶前言1. 题目介绍2. 解题思路3. 利用图片来演示青蛙跳台阶的原理4. 如何用C语言实现青蛙跳台阶前言 在本文&#xff0c;我们要与一只活泼可爱的小青蛙合作&#xff0c;带领着它跳上台阶&#xff0c;这个小家伙精力充沛&#xff0c;特别擅长于跳跃。我们要让它做我们的…

一个诡异的 Pulsar InterruptedException 异常

背景 今天收到业务团队反馈线上有个应用往 Pulsar 中发送消息失败了&#xff0c;经过日志查看得知是发送消息时候抛出了 java.lang.InterruptedException 异常。 和业务沟通后得知是在一个 gRPC 接口中触发的消息发送&#xff0c;大约持续了半个小时的异常后便恢复正常了&…

MySQL数据库中的函数怎样使用?

函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那么&#xff0c;函数到底在哪儿使用呢?我们先来看两个场景&…

前端开发:JS的节流与防抖

前言 在前端实际开发中&#xff0c;有关JS原生的节流和防抖处理也是很重要的点&#xff0c;关于底层和原理的掌握使用&#xff0c;尤其是在性能优化方面甚为重要。作为前端开发的进阶内容&#xff0c;在实际开发过程中节流和防抖通常都是项目优化的必要手段&#xff0c;而且也是…

【Project】项目管理软件学习笔记

一、前言使用Project制定项目计划步骤大致如下&#xff1a;以Project2013为例&#xff0c;按照上图步骤指定项目计划。二、实施2.1 创建空白项目点击文件——新建——空白项目&#xff0c;即完成了空白项目的创建&#xff0c;在此我把该项目保存为60mm项目管理.mpp&#xff0c;…

深入浅出1588v2(PTP)里的时间同步原理

1.时间同步1.1 单步同步(OneStep)单步同步最为简单&#xff0c;master向slave发送一个sync的同步包&#xff0c;同步包里带有这条信息发送时master的当前时间t1&#xff0c;假如这条信息从master传输到slave需要的传输时间是D&#xff0c;那么slave收到信息时&#xff0c;maste…

芯驰(E3-gateway)开发板环境搭建

1-Windows下环境配置 可以在Windows上使用命令行或者IAR IDE编译SSDK项目。Windows编译依赖的工具已经包含在 prebuilts/windows 目录中&#xff0c;包括编译器、Python和命令行工具。 1.1.1 CMD SSDK集成 msys 工具&#xff0c;可以在Windows命令行中完成SDK的配置、编译和…

嵌入式系统硬件设计与实践(第一步下载eda软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 现实生活中&#xff0c;我们经常发现有的人定了很多的目标&#xff0c;但是到最后一个都没有实现。这听上去有点奇怪&#xff0c;但确实是实实在在…

Mysql数据库总结

一.MySQL 的基础1.架构图Mysql逻辑架构图主要分三层&#xff1a;&#xff08;1&#xff09;第一层负责连接处理&#xff0c;授权认证&#xff0c;安全等等 &#xff08;2&#xff09;第二层负责编译并优化SQL &#xff08;3&#xff09;第三层是存储引擎。Mysql 服务器的默认端…

Welcome to TryHackMe --- 我在TryHackMe学习的第90天

我在TryHackMe学习的第90天 自发的thm玩家交流企鹅群&#xff1a;751273347 TryHackMe是一个及其优秀的道德嗨客学习平台 这三个月里&#xff0c;我在TryHackMe都学了什么 TryHackMe的几个路径我觉得是按照oscp出的&#xff0c;所以理论上讲我应该差不多有oscp水准&#xff…

ElasticSearch修改索引字段类型

一、Es报MapperParsingException异常 线上功能报错&#xff0c;一看日志是往es中添加数据报错&#xff0c;错误日志如下&#xff1a; org.elasticsearch.index.mapper.MapperParsingException: failed to parse field [categoryId] of type [integer] in document with id 16…

软件技术知识库必备的功能清单及注意事项!

文档是一个迭代过程。它可能需要根据客户反馈进行改进&#xff0c;或者可能需要折射文档中已包含的某些内容。知识库可以包括客户的常见问题或对解决方案的更多参考&#xff0c;这些解决方案可能需要包括这些解决方案&#xff0c;以提高效率、生产力并降低公司成本&#xff0c;…

百趣代谢组学分享—揭示水稻“生长-防御”平衡调控机制!

湖南农业大学科研团队揭示水稻“生长—防御”平衡调控机制&#xff01; 文章标题&#xff1a;Rice cellulose synthase-like protein OsCSLD4 coordinates the trade-off between plant growth and defense 发表期刊&#xff1a;Frontiers in Plant Science 影响因子&#x…

【个人总结】超详细Neo4j安装下载

【个人总结】超详细Neo4j安装下载一、下载1.1 Jdk下载1.2 Neo4j下载&#xff1a;二、安装配置2.1 解压2.2 配置三、启动Neo4j一、下载 1.1 Jdk下载 下载neo4j之前&#xff0c;需要下载jdk&#xff0c;这里默认已经下载过jdk,&#xff0c;若未下载可参考之前文章&#xff1a;h…

17.标准库特殊设施

文章目录标准库特殊设施17.1tuple类型17.1.1定义和初始化tuple访问tuple的成员关系和相等运算符17.1.2使用tuple返回多个值17.2bitset类型(后续需要时再详细了解)17.3正则表达式17.4随机数bernoulli_distribution类17.5IO库再探标准库特殊设施 17.1tuple类型 tuple(定义在tupl…

Spark工作原理

1&#xff09;Spark工作原理&#xff1a; 首先看中间是一个Spark集群&#xff0c;可以理解为是Spark的 standalone集群&#xff0c;集群中有6个节点 左边是Spark的客户端节点&#xff0c;这个节点主要负责向Spark集群提交任务&#xff0c;假设在这里我们向Spark集群提交了一个任…

周赛334(前缀和、贪心+双指针、Dijkstra求最短路径、二分答案)

文章目录[6369. 左右元素和的差值](https://leetcode.cn/problems/left-and-right-sum-differences/)前缀和[6368. 找出字符串的可整除数组](https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/)超长整数如何取余&#xff1f;[6367. 求出最多标记下标](ht…

9.3 IGMPv3

实验目的 熟悉IGMPv3的应用场景掌握IGMPv3的配置方法实验拓扑 实验拓扑如图9-22所示&#xff1a; 图9-22&#xff1a;IGMPv3 实验步骤 &#xff08;1&#xff09;配置IP地址 MCS1的配置 MCS1的IP地址配置如图9-23所示&#xff1a; 图9-23&#xff1a;配置MCS1的IP地址 MCS2…