内存管理-Linux下C编程指南

1.

静态内存

编译的时候预申请的内存,不需要自己管理,所属函数执行完毕后自动回收

缺陷:

类似下面的函数会出错:

char *uppr(char *oldstring)
{
    char newstring[100];
    ...
    return newstring;
}

因为函数执行完毕后字符数组new已经被销毁了,指针指向的位置当然就不是正确的地址。

此函数可以通过以下方式解决:

void uppr(char *old,char *new)
{
    ...
}

可以将两个字符数组传入,然后将更改写回new中。

可以实现的原因是new 所代表的数组地址是主函数定义的,更改不会随着子函数销毁而销毁,因此在子函数中对主函数变量指针的改变可以实现,经典实现就是双返回的交换

如下:

void swap(int *a,int *b)
{
    int c;
    c=*a;
    *a=*b;
    *b=c;
}

调用
swap(&a,&b);

2.

溢出

使用了超出已申请的内存,就是在申请数组是100个元素的情况下写入了101及以上个元素,或企图读取到101个及以上位置的元素

引用错误的结果不可预期,通常安全性都出自溢出区,读取了本来不能读取的位置而启动了另外的程序。

写入的错误可能会导致其他程序的数据被覆盖,程序也会出现错误。

解决方式:

通常是在进行操作时判断空间大小,进行截取,即将超出部分删除,但是这样会导致数据丢失

3.

动态内存

在程序运行过程中动态进行分配的内存,通常是自己申请

主要函数

#include<stdlib.h>
void *malloc(size_t size)
void *calloc(size_t nmemb,size_t size)
释放内存
void *free(void *ptr)
调整内存
void *realloc(void *ptr,size_t size)

注意动态内存的释放不由系统决定,而是必须使用free函数才能释放,因此在子函数中可以返回指向申请的内存的指针

例如:

char *uppr(char *old)
{
    char *new;
    if(new=malloc(strlen(old)+1)){
        strcpy(new,old);
        int i;
        for(i=0;i<strlen(new);++i){
            if(new[i]>=97 && new[i]<=122){
                new[i]-=32;
            }
        }
    }else{
        exit(255);
    }
    return new;
}

此时子函数执行完毕后new并不会被销毁,因此可以返回此地址,但是在使用完毕后最好将他是free掉。

另外,realloc函数当ptr为NULL时,等价于malloc,size为0时,相当于free

注意free后指针变为悬空指针,不可以访问(不是不能,访问悬空指针会发生不可预知的异常)。

4.

分配堆栈

#include<stdlib.h>
void *alloca(size_t size)

此时分配的内存在函数结束时被自动收回,一般很少用

5.

内存锁定

一般情况下,如果内存一段时间内不使用,系统会自动将其转移到磁盘上原位置放置新数据,如果想禁止此区域被转移,可以使用内存锁定

常用函数为

#include<sys/types.h>//锁定内存首地址+长度
int mlock(const void *addr,size_t length);//解锁内存,首地址+长度
int munlock(void *addr,size_t lemgth);/*锁定内存页,flag选项:*MCL_CURRENT  所有内存页*MCL_FUTURE  所有为进程添加的地址页*/int mlockall(int flag);
int munlockall(void);

(以上函数只限root用户)

时间: 2024-10-15 18:10:53

内存管理-Linux下C编程指南的相关文章

linux下多线程编程

最近研究mysql源码,各种锁,各种互斥,好在我去年认真学了<unix环境高级编程>, 虽然已经忘得差不多了,但是学过始终是学过,拿起来也快.写这篇文章的目的就是总结linux 下多线程编程,作为日后的参考资料. 本文将介绍linux系统下多线程编程中,线程同步的各种方法.包括: 互斥量(mutex) 读写锁 条件变量 信号量 文件互斥 在介绍不同的线程同步的方法之前,先简单的介绍一下进程和线程的概念, 它们的优缺点,线程相关的API,读者——写者问题和哲学家就餐问题. 基础知识 1. 进程和

Linux 下互联网络编程的基础知识

2019-10-07 关键字:Linux 网络编程基础 TCP/IP 协议里有两种不同的协议: 1.TCP协议 用于检测网络传输中的差错. 2.IP协议 用于对不同网络进行互联. 简单说就是 TCP 负责纠错,IP 负责传输. 网络体系结构: 网络体系结构就是将复杂的网络通信过程按照一定的规则进行分层,从而能使整个的网络通信过程更加清晰. 这一分层的核心思想有二: 1.每一层实现不同的功能,并对其上层做透明传输. 2.每一层都会使用到其下一层所提供的服务,并对其上一层提供服务. 早期的网络体系结

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

根据《linux兵书》目录 在kali上操作 第8章 Linux下的编程

第8章  浑水摸鱼:Linux下的编程 175 8.1  Linux下常用的开发工具 176 8.1.1  GCC 176 8.1.2  CVS 176 8.1.3  Perl 176 8.1.4  Linux上的Delphi--Kylix 177 8.2  Linux下的Vi文本编辑器 177 8.2.1  Vi编辑器介绍 178 8.2.2  启动Vi编辑器 179 8.2.3  显示Vi中的行号 180 8.2.4  光标移动操作 181 8.2.5  屏幕命令 182 8.2.6  文本

Linux下Socket编程的端口问题( Bind error: Address already in use )

Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误: Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,

Linux下Shell编程

Linux的shell编程 1.什么是shell? 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序. shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.一般的Linux系统都将bash作为默认的shell. 2.几种流行的shell 目前流行的shell有ash.bash.ksh.csh.zsh等,可以用下面的命令来查看she

linux 下 poll 编程

poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int poll(struct pollfd *fdarray, unsigned long nfds, int timeout) 第一个参数指向结构数组第一个元素的指针,每个数组都是一个 pollfd 结构iouyonghu制定额是某个给定描述符的条件. struct pollfd { int fd; short eve

Linux下shell编程实例

1. 判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下 read -p "input a file:" filename if [ -b $filename -o -c $filename ] then cp $filename /dev/ fi 2.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "input another nu