Linux c基本知识整理
1.指针和引用的区别
1.指针是一个变量,变量存储一个地址指向内存中一个存储单元,需要单独分配内存空间。引用相当于变量的别名,不需要单独分配空间
2.引用必须初始化,指针可以先不进行初始化
3.指针可以设置为const类型,引用不可以为const
4.作为形参时,引用在函数体内可直接修改原值,指针是原变量的一个拷贝
5.单目运算符++,作用在引用上int a=1;int b=&a; b++相当于a++;
作用在指针上int a =1; int *b=&a; b++只表示指针地址增加,a不曾变化
6.指针可以有多级,引用只有一级。
7.指针定义后可以修改为执行其他的存储单元,引用定义后不能修改。
8.sizeof运算符处理后,计算指针表示指针的大小:32为系统得到4;计算引用得到相应类型的大小:char型引用为1.
2.volatile作用(cpu缓存机制),实例有哪些?
在编译优化时,为了优化执行速度,有些变量在调用时使用保存在寄存器中的拷贝。使用volatile修饰的变量表示这个变量会被意外改变,每次使用都应小心的从内存读取原值
>现象举例:
1.状态寄存器的内容
2.中断服务程序中访问的非自动变量
3.多线程程序的共享变量
3.static const用法说明(参数及变量)。
>const用法:
1.在定义的时候必须进行初始化
2.表示不会被程序修改的变量
3.修饰形参表示形参在调用函数体内不能被修改
4.修饰指针时的几种情况:
const int *a 指针指向的为一个常整形数
int *const a 指针是一个常指针
const int *a const 一个执行常整形数据的常指针
static用法:
1.static变量只会被定义一次,避免了多重定义的问题
2.static变量默认初始化为0,存储在静态存储区BSS段。变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
3.变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
4.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
4.内联函数作用,与宏定义的区别。内联函数为什么定义在头文件中并且加static
宏的作用是基本的字符替换,在编译阶段进行。内联函数的使用时为了节省掉函数调用的时间,省去了call和ret并且具备函数功能
1.内联函数在运行时可调试,而宏定义不可以;
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
4.在类中声明同时定义的成员函数,自动转化为内联函数。
>内联函数为什么定义在头文件中并且加static
inline 关键字实际上仅是建议内联并不强制内联,gcc中O0优化时是不内联的,即使是O2以上,如果该函数被作为函数指针赋值,那么他也不会内联,也必须产生函数实体,以获得该函数地址。
经测试c文件中的仅inline函数即使Os优化也不内联,因为没有static,编译认他是全局的,因此像普通函数一样编译了,本c文件也一样通过 bl inline_func 这样的方式调用,不像网上别人说的,本c会内联,其他c文件则通过bl inline_func 方式。加入static 后则内联了。(Os优化等级测试)
所以在头文件中用inline时务必加入static,否则当inline不内联时就和普通函数在头文件中定义一样,当多个c文件包含时就会重定义。所以加入static代码健壮性高,如果都内联了实际效果上是一样的。(gcc下验证过O0级别includes.h中仅定义inline的函数,编译失败,Os编译成功)
虽然知道了头文件中用inline函数时要加入static,但是为什么要在头文件中定义函数呢?
一些简单的封装接口函数,如 open() { vfs_open() } 仅仅是为了封装一个接口,我们不希望耗费一次函数调用的时间,解决方法一是宏,但是作为接口,宏不够清晰。那选择inline,但是如果在c文件中写
main.c
inline void open(void)
{ vfs_open(); }
5.静态内存分配和动态内存分配区别。
答:bool类型,任何非零值都是真,记做TRUE,零值记做假,FLAUSE。与零值比较通常使用if(var)和if(!var)。
Int型与零值比较很简单,if(var==0)和if(var!=0).
Flaot型变量。应该注意精度限制。它和double变量一样,不能使用“==”或者“!=”,正确的使用是const float EPSINON=0.00001;if(var>=-EPSINON)&&(var<=EPSION)
指针变量,if(p==NULL)和if(p!=NULL).
6。枚举与#define的区别
7.内存对齐规则。
(1)对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个暑假成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员自身长度)的倍数;
(2)在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员大小中,比较小的那个进行;
#pragma pack(n)表示设置为n字节对齐。VC 6.0默认8字节对齐。
内存对齐的主要作用:
(1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取得某些特定类型的数据,否则抛出硬件异常。
(2)性能原因:经过内存对齐后,CPU的内存访速度大大提升。
图一:

这是普通程序员心目中的内存印象,由一个个的字节组成,而CPU并不是这么看待的。
图二:

CPU把内存当成是一块一块的,块的大小可以是2,、4、8、16字节的大小,因此CPU在读取内存时是一块一块进行读取的。块大小成为memory granularity(粒度)。
8.动态分配对象与静态分配对象区别。
9.内存溢出有哪些因素。
1.格式字符串复制 2.递归调用 3.
10.new/delet与malloc/free区别。
11.模板怎么实现,模板的作用
重载:相同的范围在同一个类中,函数名相同,参数不同,virtual关键字可省略
覆盖:不同的范围(分布基于派生类和基类),函数名相同,参数相同,基类中一定要有virtual关键字。
隐藏:是指派生类的函数屏蔽了和他同名的基类函数。隐藏的规则:
(1)派生类的函数与基类的函数同名,但是参数不同。基类的函数将被隐藏,此时不管有无关键字(注意别与重载混淆)。
(2)派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
13.多态
- 多态是什么:多态是由虚函数实现的。举例:动物基类和派生类(叫声)
- 多态都有哪些(动态和静态的):http://blog.csdn.net/hackbuteer1/article/details/7475622
- 多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。(通过函数重载实现的)而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。(通过虚函数实现的)
- 动态绑定怎么实现:声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。
- 例如:A *a;B b;a=&b;a.god();//这也是相当于动态绑定(有些题目比较难理解)
- 纯虚函数和虚函数区别
- 纯虚函数:在基类中只能声明不能定义,在派生类中必须都实现这个纯虚函数。带有纯虚函数的称为抽象类,只能当做基类使用,抽象类不能定义对象
- 虚函数:在基类中声明定义,但是在派生类中可以不定义。
- 引入纯虚函数比较安全,效率也比较高。
14.说说什么是野指针?野指针什么情况下出现? (详细)
- 野指针:指向一个已经删除的对象或者未申请访问受限地址的指针。
- 出现情况:没有初始化(要么等于NULL,要么指向对的地方),释放指针没有置为NULL(释放只是释放了指针所指的内存,指针本身并没有释放掉)
15.断言ASSERT()作用是什么?它是函数还是宏?为什么不能是函数?
- assert其实是一个宏,它的作用是一个判断计算表达式真假。例如:assert(a!=0)(一般的它只允许调用一个表达式参数,如果多个参数判断不准确),如果a!=0,就是结果正确,程序继续运行,如果false那就会先向stderr打印一个错误信息,然后再调用abort终止程序。(一般把这个宏放在程序中来进行调试,它主要是用作debug版本中 )
- 它的缺点是:频繁的调用会影响程序的性能,会增加额外的开销。
12.多线程锁机制有哪些
13.自旋锁和互斥锁区别。
14.进程间通信和线程间通信方法
1.线程间通信:管道,消息队列,共享内存,全局变量,
15.
Linux c基本知识整理的更多相关文章
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- Linux进程管理知识整理
Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...
- Linux系统基础知识整理
一.说明 本篇文章,我将结合自己的实践以及简介,来对linux系统做一个直观清晰的介绍,使得哪些刚接触Linux的小伙伴可以快速入门,也方便自己以后进行复习查阅. 二.基本知识整理 1.Linux文件 ...
- Linux系统基础知识整理(一)
本文来自于: https://www.cnblogs.com/hafiz/p/6686187.html#4196989 一.说明 本篇文章,我将结合自己的实践以及简介,来对linux系统做一个直观清晰 ...
- Kali Linux渗透基础知识整理(一):信息搜集
写在前面的废话:最近要给一些新人做培训,整理些东西,算不上什么太高端的内容,只是简单的整理下了,我觉得对于小白的话也还算是干货.在乌云水了几年,算不上什么大神水平,最近生活费紧张,现在打算在FreeB ...
- Kali Linux渗透基础知识整理(三):漏洞利用
漏洞利用阶段利用已获得的信息和各种攻击手段实施渗透.网络应用程序漏洞诊断项目的加密通信漏洞诊断是必须执行的.顾名思义,利用漏洞,达到攻击的目的. Metasploit Framework rdeskt ...
- linux 相关零碎知识整理
1.启动bash shell 大部分linux系统启动用户命令行接口(cli)环境时使用默认的bash shell,在bash shell启动时,它将自动执行位于用户主目录下的.bashrc中的命令. ...
- linux 知识整理1linux 常见的目录
linux 系统现在也是搭配啦图形操作界面. 本人初次学习linux,不是为工作,我的工作是玩Asp.net 的.学习linux 也算是知识的储备吧. 学习linux必须知道一些基本的知识. 目录 用 ...
随机推荐
- tidb集群
tidb ansible部署 https://zhuanlan.zhihu.com/p/27308307?refer=newsql 网址:http://www.cnblogs.com/mowei/p/ ...
- 用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 SQLAlchemy 的 CRUD Create 增添数据 ...
- 发送验证码倒计时60s
var wait=60; function time(o) { if (wait == 0) { o.removeClass("gray"); o.text("发送验证码 ...
- python作业/练习/实战:生成双色球小程序
作业要求: 每注投注号码由6个红色球号码和1个蓝色球号码组成.红色球号码从1--33中选择:蓝色球号码从1--16中选择 代码范例 import random all_red_ball = [str( ...
- PAT甲级——A1143 LowestCommonAncestor【30】
The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...
- PHP中使用raw格式发送POST请求
如果请求的参数格式是原生(raw)的内容,应该如何为程序构造一个POST请求函数呢? function http_post($url, $data_string) { $ch = curl_init( ...
- Anjular的ng-repeat
Anjular的ng-repeat不会循环一个二维集合中的一维集合.举个例子:集合 list= {1,2,{0,1,2},23,222},small={0,1,2},使用ng-repeat" ...
- leetcode.数组.769最多能完成排序的块-Java
1. 具体题目 数组arr是[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序.之后再连接起来,使得连接的结果和按升序排序后的原数 ...
- mybatis中的命名空间(namespace)的作用
mybatis中为每一个映射文件添加一个namespace,这样不同的映射文件中sql语句的id相同也不会有冲突,只要定义在映射文件中的sql语句在该映射文件中id唯一就可以
- testparm - 检查smb.conf配置文件的内部正确性
总览 testparm [-s] [-h] [-L servername] [configfilename] [hostname hostIP] 描述 此程序是samba套件的一部分. testpar ...