C语言的标准函数库与内存管理有关的函数从功能上分为两类:一类是系统对内存操作的函数,例如,读内存的函数、写内存函数,如从指定地址向内存写一个字节,一个字或向内存读一个字节或一个字操作;另一类是供用户动态使用内存的函数,例如,分配C程序一块存储区,并将该区清零函数;

1.动态内存分配函数

假如欲设计一个C程序,要求从一个文件读取一组数据并存放在数组中。如果无法预先知道文件中数据的确切数量,或者在再次运行时文件的数量发生变化,那么就需要在程序中把数组定义得足够大,才能适应上述情况。但这样做往往导致内存空间的浪费。动态分配内存可使程序在执行过程中获得需要的内存空间,以便更有效地利用内存空间。现将常用内存管理函数及其使用分别介绍于下:

(1)calloc()函数

功能
该函数是分配给C程序一块存储区,并将该存储区消零。程序在调用该函数时需要引用两个参数,分别指出程序分配对象个数和每个对象所需内存空间的字节数。calloc函数返回一个内存储区的字符指针,指向所分配内存区域的起始位置。若函数调用失败,返回NULL。调用格式calloc(number,size);
说明
调用此函数后,可占用从内存地址number开始的size个字符长度的连续内存空间,函数返回指向该空间起始位置的指针。
当内存空间不够分配时,calloc()返回空指针。因此,calloc()是一个返回值为指向字符的指针的函数。即
char *calloc();
其中number、size为无符号整数,即
unsigned int number size;
应用举例
应用calloc()函数从堆中申请255个字节的存储区,并向该区输入输出字符串,可编写如
下程序实现:

#include
#defint N 255
#define S 1
main()
extern char *calloc()extern char *fgets();
extern int fputs(),free();
char *buffer;
buffer=calloc(N,S);if (!buffer)
abort("Ug,too big \n");
fputs ("Enter data follwed by Ctrl-Z\n),stdout);while (fgets(buffer,N,sldin))
fputs (buffer,stdout);
free(buffer);
}

(2)malloc()函数

调用格式
malloc(Size);
功能
该函数被调用后,可占用预先指定了的内存区中的size个字符长度的连续内存空间,它允许程序按需要分配内存,而且恰好分配所需的大小。
说明
如果该函数调用成功,返回size空间的第一个字节的地址,当内存空间不够分配时,返回
NULL。它也是一个返回值为指向字符的指针函数,即:
char *malloc();
size也是无符号数,即;
unsigned int size;
malloc()与calloc()的区别是,malloc()只能在指定的内存空间中占用size个字符长度的连续空间,而calloc()可在任意的内存空间占用size个字符长度连续空间,这个内存空间的起始位置在调用函数calloc()时,临时指定。
应用举例
使用malloc()函数从堆中分配255个字节存储区,并对该区清零。
可编写如下程序实现:

#include
main()
{
extern char *malloc();
extern int free();
char *buf ;
unsigned number-bytes;
int i;
number-bytes=255;
buf=malloc(number-bytes);
printf("%s\n",buf);
for(i=0;j *(buf+j)=EOS;
printf("%s\n",buf);
free(buf);
}
}

(3)free()函数

调用格式
free(pointer);
功能
该函数释放由calloc()或malloc()函数分配的存储空间,以便下次重新分配,以提高内存资源的使用效率。
说明
函数free()的调用需要一个指定释放内存空间的指针参数,在程序中应为字符型指针,
即:
char *pointer;
如果释放成功,函数free(pointer)返回值为零:当pointer参数为无效指针,返回值为-
1。

(4)rcalloc()函数

调用格式
rcalloc(pointersize);
功能
该函数用于改变callc()或malloc()所占用的内存区的大小,即将calloc()或malloc()
指定的size数改为rcalloc()指定的size指定的size数。
说明
该函数调用成功返回由pointer指针变量所指向的地址;当内存空间不够分配时,返回值为0。当不需要占用的内存空间时,用free()或cfree()释放。

2.内存读写函数

(1)peek()函数

功能
从内存指定的段偏移地址单元中读一个字。
格式
int peek ( unsigned segment,unsigned offset);
说明
peek()函数返回相应地址上的一个字的内容。
内存各地址是以段地址:偏移地址的格式。例如,0070:0000是绝对地址×’0700’。
应用实例
利用peek()函数,读取40:13单元的内容(此单元的一个字记录着系统存储器总容量,以KB为单位)并显示到屏幕上。可编写如下的程序实现:

#include
#include
#define SEGMENT 0X0040
#define OFFSET 0X0013
main()
{
int value=0;
value=peek(SEGMENT,OFFSET);
printf("\n The RAM is %d K.",value);
getchar();
exit(0);
}

(2)peekb()函数

功能 从内存指定的段:偏移中读取一个字节。
格式 char peekb(unsigned segment,unsigned offset);
说明 peekb()函数返回相应地址上的一个字节的内容。
应用实例 读取0X40:0X11处的一个字节,并分析其硬件设备的配置情况。可编写如下程序实现:

#include
#include
#iclude
main()
{
char value=0;
char va;
printf("\n 当前机器的硬件配置");
value=peekb(0X40,0X11);
if (Value & 1);
printf ("\n DMA芯片已被安装");
else
printf("\n DMA芯片没有安装");
if (value & 16);
printf("\n 游戏卡已经安装");
if (value & 32);
printf("\n 串行打印机已经安装");
va=value>>6;
printf("\n 打印机安装的数目为%d,va);
}

(3)poke()涵数

功能 向内存中写一个字。
格式 void poke ( unsigned segment,unsigned offset,int value);
说明 其中segment为要写入内存的段地址。offset为要写入内存的偏移量。value为要写入内存的值。
由于poke()函数有修改内存数据的能力,所以使用此函数时一定要注意,如果操作错误,其结果常常是死机。出现此类错误的原因多是由于指定的段地址、偏移地址的数值不正确或没有赋予初值,再有就是所写的数值不被系统所承认。

(4)poded()函数

功能 向内存中写一个字节。
格式 void poke (unsigned segment,unsigned offset,char value);
说明 其中segment为要写入内存的段地址,offset为要写入内存的偏移量。value为要写入内
存的值。
应用实例
从段地址100H处开始写内存5个字的数据,然后逐个字读取。可编写如下的程序实现:

#include
main()
{
extern int peek();
extern int poke();
unsigned offset,segment;
int word=0x0000;
int i;
segment=0x100;
putchar("/n");
for(offset=0;offset<10;offset++)
poked(offset,segment word++);
for(offset=0;offset<10;offset)
{
word=peek(offset,segment);
printf("peek(%xh,%xh)=%xh\n",offset segment,word);
offset++=2
}
}

综合地使用poke(),pokeb(),peek(),peekb()这四个函数,可以达到控制操作系统的软件资源的目的。

C/C++与内存相关的函数相关推荐

  1. 封装进程内存相关操作函数

    //ProcessMemory.h:进程内存操作封装 #pragma once #include <windows.h> #include <TLHELP32.H>class ...

  2. 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

    文章目录 一.判定指针合法性 二.数组越界 三.不断修改指针变量值 四.函数中将栈内存数组返回 五.函数间接赋值形参操作 六.指针取值与自增操作 一.判定指针合法性 判定指针合法性时 , 必须进行如下 ...

  3. C语言中常见的内存相关的Bugs

    这里写目录标题 内存相关的Bugs 一.常见的错误参考 1.经典的scanf bug 2.指针未正确初始化 3.指针被释放时没有置空 4.不要用return语句返回指向"栈内存"的 ...

  4. #内存泄露# linux常用内存相关命令

    Table of Contents free命令 vmstat命令 top命令 cat /proc/meminfo ps aux命令 free命令 free 命令会显示系统内存的使用情况,包括物理内存 ...

  5. php常用的数组相关的函数及面向对象

    内 容 本周学习知识点: 一.PHP的循环结构 二.PHP函数的声明与使用 三.数组的定义以及遍历 四.常用的数组相关的函数 五.面向对象 六.三大特性以及修饰符.关键字 七.抽象类.接口.多态性 八 ...

  6. Linux 内存相关问题汇总

    这篇文章是对 Linux 内存相关问题的集合,工作中会有很大的帮助.关注公号的朋友应该知道之前我写过从内核态到用户态 Linux 内存管理相关的基础文章,在阅读前最好浏览下,链接如下: CPU是如何访 ...

  7. skb结构和相关操作函数

    skb是linux kernel中收发数据包用到的控制结构体,有些字段指向分配的内存用于存放数据包, 向协议栈传送时,通过移动指针来获取到以太头,网络头,传输头等信息. skb结构和相关操作函数 a. ...

  8. FreeRTOS学习笔记【六】——FreeRTOS 任务相关 API 函数

    上一章我们学习了 FreeRTOS 的任务基础知识,本章就正式学习如何使用 FreeRTOS 中有关任务的 API 函数.本来本章想讲解 FreeRTOS 的任务原理知识的,但是很多初学者还没使用过 ...

  9. 内存管理-alloc_pages()函数分配内存

    前言 Linux对页面分配分快速和慢速两种方法.在__alloc_pages_nodemask函数中,首先会使用快速方法进行内存分配,当分配失败时会进入慢速路径,函数最终会返回申请到的内存第一个页面p ...

最新文章

  1. Hadoop 生态系统
  2. 使用sql来拼接语句,最终传入Mybatis中执行
  3. 2014年全国职称计算机考试word2007考试真题,全国职称计算机考试讲义·真题·预测三合一. Word2007中文字处理...
  4. 9. Leetcode 27. 移除元素 (数组-同向双指针-快慢指针)
  5. Eclipse与MyEclipse的选择问题
  6. ArrayList的add(E e)方法与扩容
  7. 这本 “写不完” 的黑科技笔记本,恐怕要颠覆整个行业!
  8. uniapp踩坑指南之坑多到写不完
  9. hdu5692 Snacks dfs序+线段树
  10. mvc自定义日期转换器
  11. 注解由谁读取并解析的?
  12. Python Twisted 介绍
  13. python树莓派 是什么_用树莓派和Python给你的植物浇水
  14. 普通索引和唯一索引,难道还分不清
  15. 【Machine Learning】TensorFlow实现K近邻算法预测房屋价格
  16. php如何防止重复提交表单,如何防止php重复提交表单方法
  17. layui循环遍历数据_Layui之动态循环遍历出的富文本编辑器显示
  18. excel熵值法计算权重_手把手教你用熵值法计算权重
  19. oracle临时表怎么删除吗,删除Oracle临时表
  20. 4.1-自动调整学习速率

热门文章

  1. unity中链接字符串和变量显示_理解Unity中的优化(六):字符串和文本
  2. c语言1e3和1e3,自考“高级语言程序设计”习题答案详解(33)
  3. ZOJ 2060----Fibonacci Again
  4. #ifndef的作用
  5. HYSBZ - 1101——莫比乌斯反演
  6. 进程的挂起以及可重入函数
  7. 【C++ Primer | 16】容器适配器全特化、偏特化
  8. Java面试题及答案,java底层实现原理
  9. 我在华为做Android外包的真实经历!吊打面试官系列!
  10. 移动端上传大文件到服务器,android上传大文件到服务器地址