• C如何使用内存


    栈:
     
    自动变量:auto。变量的地址在栈中。
     
    C语言函数调用的实现:
    • 在调用方,参数从后往前按顺序被堆积在栈中
    • 和函数调用关联的返回信息(返回地址等)也被堆积在栈中。
    • 一旦函数调用结束,局部变量占用的内存区域就被释放,并使用返回信息返回到原来的地址。
    • 从栈中出去调用方的参数。
    测试程序:
     
    结论:
    1. 地址值越大,表明越在栈底部。
    2. 参数从后往前堆积,所以看到b的地址(0033F950)大于a的地址(0033F94C)
    3. 局部变量数组也是从后往前堆积,下标越大,地址越大,越在底部。注意,局部变量(auto)的内存区域是在函数被调用时,也就是执行时被分配的。
     
    C语言的可变长参数的实现,就是基于函数参数从后往前堆积。
    • printf("%d,%s ",100,str);
    printf函数支持无限长度的参数。先将参数从后往前向栈中堆积,在最上面的就是第一个参数,也就是"%d,%s "。然后才是函数的返回信息、局部变量等等。通过解析第一个参数,就可以知道后面有几个参数。
     
    编写自己的带有可变长参数列表的函数:用 ... 代替可变长参数列表
     
    动态内存分配
     
    利用malloc()进行动态内存分配
    malloc()不是系统调用,它是一个库函数。本质上它调用了系统调用brk()
    • 系统调用:请求操作系统来帮我们去做一些特殊的函数群
    系统调用brk()就是通过设定堆下面一片很大的内存空间的末尾地址来伸缩内存空间。
    函数调用时,栈会向地址较小的一方伸展。多次调用malloc时,会调用一次brk(),内存区域会向地址较大的一方伸展。
     
    free()释放内存:
    • 一般来说调用free()之后,对应的内存是不会立刻返回给操作系统的。
    • 只有随着某次malloc调用,恰好把这篇区域重新分配后才会发生这一部分内容的改写
    • 但是C标准不保证情况总是这样,因此,调用free()之后,是不能引用对于的内存区域的。
    临时变量和返回值
     
    临时变量是不可见的,只要程序产生了一个非堆上对象而没有命名它,这便是诞生了一个临时变量,比如函数调用时的参数类型转换,以及函数返回对象的时候
  • 相关阅读:
    nodejs实现端到端加密
    DiffieHellman(迪菲-赫尔曼)密钥交换算法原理及其实现
    MongoDB主备 版本3.6.5
    linux源地址转换
    Mac下IDEA快捷键操作
    Ubuntu离线安装gcc
    VM安装Mac时,使用Unlocker12 插件时报getTools错误的问题
    华为OSPF与ACL综合应用实例讲解
    基于全局地址池的DHCP
    浮动静态路由及负载均衡
  • 原文地址:https://www.cnblogs.com/amghost/p/3572152.html
Copyright © 2020-2023  润新知