C 语言小知识
时间:2022-07-22
本文章向大家介绍C 语言小知识,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
C 语言小知识
堆与栈(Heap and Stack)
堆相对比较容易理解, 就是计算机剩余的内存, 可以通过 malloc 函数访问获取堆内存。 每次调用 malloc , 操作系统使用内部函数为你注册分配一块内存, 并返回指向它的指针。 当你使用完之后, 要用 free 函数将它返回给操作系统以便其它程序可以使用。 如果没有这么做的话, 将会导致你的程序出现内存泄漏。
栈是一个特殊的内存区域, 存储函数创建的本地变量。 它的工作原理是每个函数的参数被压入堆栈,并在函数内使用。 这是真正的栈道数据结构, 后进先出。 对于本地变量也是相同的。 栈的好处是简单, 当函数退出时, C 编译器将这些变量推出栈道进行清理。 这样可以简单的避免栈道上的变量有内存泄漏。
如果变量不是用 malloc 直接获取, 也不是在函数内通过 malloc 间接获取, 那么这个变量就是在栈上。
堆栈需要注意的三个问题
- 如果你在栈上用 malloc 获取了一块内存, 并将指针指向这块内存, 当函数退出时, 指针将会被推出栈道并丢失;
- 如果在栈上使用过量的数据(大型数据结构和数组), 将会出现栈溢出(StackOverflow)并导致程序退出。 在这种情况下, 应通过 malloc 使用堆内存;
- 如果在栈上将指针指向变量, 将它作为你函数的返回值, 那么接受返回值的函数将会出现段错误(Segmentation fault),因为指针指向的数据已经被出栈并被清理了, 指针指向了无效区域(Dead space)。
指针
指针的典型用法
- 向系统申请一块内存, 包括字符串以及结构体;
- 作为参数向函数传递大块内存,通过使用指针就不用传递整个内存块;
- 指针指向函数的地址作为进行动态回调;
- 负责扫描内存或文件,比如:将网络 Socket 数据流转换为复杂的结构或者分析文件
指针的语法
type * ptr // 定义一个名称为 ptr 的 type 类型的指针;
*prt // 指针 ptr 指向内容的值;
*(ptr + i) // 指针 (ptr + i) 指向内容的值
&thing // thing 的地址
type *ptr = &thing // 将名称为 ptr 的 type 类型的指针指向 thing 的地址
ptr++ //将 ptr 指向的地址加一位
- OC学习14——谓词
- 如何在32位系统中使用ROP+Return-to-dl来绕过ASLR+DEP
- 如何使用Twitter构建C;C服务器
- 【Python语言】Scikit-learn 快速入门
- 抽象SQL查询:SQL-MAP技术的使用
- 简析60度CMS的Cookies欺骗漏洞
- OC学习13——Foundation框架中的集合
- 如何成为一个伟大的前端工程师
- 花生壳黑吃黑之一:Web练手基地
- OC学习12——字符串、日期、日历
- OpenStack:建立虚拟的渗透测试实验环境 – 安装篇
- OC学习10——内存管理
- 使用CefSharp开发一个12306“安心刷票弹窗通知”工具
- OC学习9——反射机制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法