Linux环境内存管理——链表(Windows程序员视角)

文章通过一个C语言示例介绍了Windows程序员如何学习Linux环境中的内存管理,特别是动态链表的创建和操作。程序演示了动态分配内存来构建学生信息链表,并输出数据,强调了指针在链表中的作用和动态内存分配的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

使用链表或者队列等数据结构时,通常会使用动态内存存储数据。链表是一种动态地进行存储分配的结构,是根据需要开辟内存单元。

创建动态链表就是指在程序执行过程中,从无到有,按照需求开辟节点和输入各节点数据,并建立起前后相连的关系。通常链表中的节点会使用结构体变量这个数据类型的变量。这样,一个节点就可以表示多个不同数据类型的相关联的信息。在动态链表中,必须利用指针变量才能实现节点与节点之间相连接,因此在一个节点中应包含一个指针变量,用它存放下一个节点的地址。例如,可以设计这样一个结构体类型:

struct student
{
  int num;
  int age;
  float score;
  struct student *next;      /*指向链表的下一个节点*/
}

在VI编辑器中编写一个简单的C语言程序test.c,实现创建一个学生信息链表,学会如何动态地分配所需的内存空间,以及如何通过链表,将存储在内存空间中的数据输出到控制台。

#include<malloc.h>
#include<stdio.h>
#define KUAI sizeof(struct student)
typedef struct student
{
  int num;
  int age;
  float score;
  struct student *next;     /*指向链表的下一个节点*/
}stu;    /*声明结构体类型 struct student,并取别名为 stu*/
int n;
stu *creat(void)  /*创建动态链表函数*/
{
  stu *head,*p1,*p2;  /*定义结构体类型的指针*/
  n=0;
  p1=p2=(stu*)malloc(KUAI);   /*开辟一个内存空间*/
   scanf("%d, %d, %f",&p1->num,&p1->age,&p1->score);/*输入结构体类型的数据*/
   head=NULL;   /*头指针置空*/
  while(p1->num!=0)    /*判断学号输入是否为0,若是0则跳出循环*/
  {
     n=n+1;
     if(n==1)head=p1;  /*判断输入的是否是第一个数据,若是第一个数据,则将头指针指向p1*/
      else
        p2->next=p1;  /*将p2指向的下一个地址指向p1*/
     p2=p1;  /*p2指向p1*/
     p1=(stu*)malloc(KUAI);/*再次为p1开辟一个内存空间,存储下一个数据*/
      scanf("%d, %d, %f", &p1->num,&p1->age,&p1->score);
     }
    p2->next=NULL;  /*p2指向下一个地址指向的是空指针*/
    return(head);     /*返回数据信息的头指针,以便从头输出*/
}
main()
{
  stu *p,*head;
  head=creat();
  p=head;  /*p指向头指针*/
  if(head!=NULL)    /*判断头指针是否为空,不为空则执行循环体输出信息*/
   do
  {
     printf("%d, %d, %f\n",p->num,p->age,p->score);
     p=p->next;
   }while(p!=NULL);
}

运行效果如下:

$ gcc -o test test.c

$./test

101,20,94.48

102,22,82.69

103,21,89.56

0

101,20,94.480002

102,22,82.690002

103,21,89.559998

$

这个程序实现了将学生的学号、年龄和成绩3项信息动态地存储在链表中,根据需要可以输入任意多名学生的信息,直到输入0时,结束输入。此时,程序会在终端显示出存储的学生信息。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值