zoukankan      html  css  js  c++  java
  • 菜猫学习linux笔记(1)

    内存的管理和使用

    size hello

    text 代码区静态数据

    data 全局初始化数据区

    bss 未初始化数据区

    一个计算机应用程序在内存中可以分成两个部分:存放代码的代码段和存放数据的数据段。代码段存放用户编写的代码,数据段可以分成堆和栈

     

    数据段有增加了全局初始化数据区(initialized data segment / data segment)包含程序中明确被初始化的全局变量、静态变量(包括全局和局部静态变量)以及常量(例如字符串)

     

    未初始化数据区(uninitialized data segment)bss区 存放全局未初始化变量

     

    有编译器分配释放的区域,用来存放函数的参数,局部变量等。当调用函数的时候,被调用函数的参数和返回值被存储到当前程序的栈区,之后被调用函数再为自身的自动变量和临时变量在栈区上分配空间。当函数调用返回时,在战区内的参数返回值,自动变量和临时变量等会被释放。

    这就是为什么C语言函数参数如果不是指针的话,被修改的参数结果用户无法得到的原因。

    堆 heap

    位于bss段和栈之间,用来动态分配内存。这段区域有程序员管理

    堆的管理和栈不同,操作系统在堆空间维护一个链表,每次程序员从堆分配内存的时候,操作系统会从堆区扫描未用空间,当一个空间的大小符合申请空间的时候,就把此空间返回给程序员,同时把申请的空间加入链表。、

     

    程序的内存分成若干区域基于以下考虑:

    程序运行的时候多数按照顺序运行的,虽然有跳转和循环 数据需要多次访问 开辟单独的数据空间方便数据访问和分类

    临时数据放在栈区

    全局数据和静态数据在整个程序执行过程中都可能需要访问,因此单独存储管理

    用户需要自行分配的内存安排在堆区,便于用户管理内存,以及操作系统监控

     

     

    malloc返回的是分配内存的首地址

     

    calloc 分配新内存 realloc用来改变一块已经分配的内存大小

    void *calloc(size_t nmemb, size_t size)nmemb 表示要分配元素个数 size表示每个元素大小

     

    malloc函数分配内存后不能初始化内存

    calloc 分配空间会初始化新分配的内存空间

     

    int *p = (int *)malloc(1024,sizeof(int))

     

    int *p = (int *)malloc(1024*sizeof(int))

    memset(p,0, 1024*sizeof(int))

     

     

    void *realloc(void *ptr,size_t size)

    realloc函数调整后内存空间起始地址有可能与原来不同

     

     

     

     

  • 相关阅读:
    将字符串数组转换成整形数组
    层的三级联动
    sql
    工作中的感悟
    asp.net如何抓取其他网站的内容
    看不到的SQl
    对数据库中时间为空的处理和数据转换成百分数
    不带查询条件的分页
    svn中出现红色感叹号
    视图的创建(根据已有的表)
  • 原文地址:https://www.cnblogs.com/amywu2015/p/5216343.html
Copyright © 2011-2022 走看看