【ps:当我们面试结束后
所有的(过与没过的)都觉得被虐了,不是因为面试官被虐,不是因为面试官问题很难,而是我们被自己准备的不够充分而觉得被虐了,因为这些问题不难,但是让你口述的效果却是会很差的】
1.TFTP通信过程
任何传输起自一个读取或写入文件的请求,这个请求也是连接请求。如果服务器批准此请求,则服务器打开连
接,数据以定长512字节传输。每个数据包包括一块数据,服务器发出下一个数据包以前必须得到客户对上一个数据
包的确认。如果一个数据包的大小小于512字节,则表示传输结束。如果数据包在传输过程中丢失,发出方会在超时
后重新传输最后一个未被确认的数据包。通信的双方都是数据的发出者与接收者,一方传输数据接收应答,另一方
发出应答接收数据。
2.ip包头内容,TTL工作原理
1.1、版本:长度4位,标识了报文的IP版本号
1.2、报头长度:字段长度为4位,它表示IP报头的长度
1.3、服务类型:字段长度为8位,它用来指定特殊的报文处理方式。
1.4、总长度:字段长度为16位,它的指整个IP报文的长度,以8bit字节为单位,其中包括IP报头。
1.5、标识符:字段长度为16位,通常与标记字段和分片偏移字段一起用于IP报文的分片。
1.6、标记字段:长度为3位,第一位没有被使用,第二位是不分片位(DF),当DF被设置被设置为1时,表示路由器不能对报文进行分片处理。
1.7、生存时间:字段长度为8位,也就是跳数的大小。
1.8、协议
:字段长度位8位,它主要是标识出传输层的地址或协议号,也就是说表示数据要进行什么样的上层服务。
1.9、报头校验和:字段长度16位,针对IP报头进行纠错。
1.10、源地址和目标地址:也就是两端的地址,比如IP地址。
1.11、可选项:主要用于测试。
1.12、填充:该字段通过在选择字段后面添加0来补足32位,保证报文长度是32比特的倍数
TTL: (Time To
Live)生存时间,是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时
间内不能被传递到目的地。例如,不正确的路由表可能导致包的无限循环。一个解决方法就是在一段时间后丢弃这个包,然后给发送者一个报
文,由发送者决定是否要重发。TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢
弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送
一个ICMP报文给最初的发送者。
查看本机的TTL值
: 开始-运行-输入cmd回车,在光标闪动的地方输入 ping
127.0.0.1然后回车就行了。
TTL=32 Windows 9x/Me
TTL=64 LINUX
TTL=128 Windows 200x/XP
TTL=255 Unix
3.死锁的原因
进程A占用一个资源,进程B也占用一个资源,此时进程A正好要用进程B占用的资源,而正好B也要占用A的资源。形成抱死。
28.什么是死锁
进程A占用一个资源,进程B也占用一个资源,此时进程A正好要用进程B占用的资源,而正好B也要占用A的资源。形成抱死。
4.进程间通信的方式
八种:管道,命名管道,消息队列,信号,信号量,共享内存,socket,文件。
5.挂载命令
mount -o nolock wsize=1024,rsize=1024
10.220.4.10:/home/xj /mnt
6.TCP和UDP的区别
UDP
是非连接协议,通信前不必与对方建立连接,不管对方在不在线,不能提供可靠性、流控、差错恢复功能,用于一次只传送
少量数据,可靠性低,支持的应用协议: NFS SNMP DNS
TFTP
TCP
是连接协议,通信前必须建立连接传输可靠,用于传输大量数据、速度慢、建立连接需要开销较多的资源
7.问过是否了解操作系统
8.socket参数内容
int socket(PF_PACKET, SOCK_RAW, protocol)
功能:创建链路层的原始套接字
protocol:指定可以接收或发送的数据包类型
• ETH_P_IP:IPV4数据包
• ETH_P_ARP:ARP数据包
• ETH_P_ALL:任何协议类型的数据包
返回值:
• 成功(>0):链路层套接字
• 失败(<0):出错
9.linux命令有哪些
10.libpcap和libnet是什么,有哪些函数,过滤的实现原理
libpcap是网络数据抓包工具,可以捕获所有的包括到达其他主机上的网络数据包。
libnet是专业的构造和发送网络数据包的开发工具包,允许开发者自己构造和发送网络数据包。
包过滤机制实际上是针对数据包的布尔值操作函数。
11.MAC头部字节数以及都是什么
14个字节,源Mac目的Mac和协议类型。
12.select/poll/epoll 工作原理
首先还是来看常见的select和poll。对于网络编程来说,一般认为poll比select要高级一些,这主要源于以下几个原因:
1.poll() 不要求开发者计算最大文件描述符加一的大小。
2.poll()
在应付大数目的文件描述符的时候速度更快,因为对于select()来说内核需要检查大量描述符对应的fd_set 中的
每一个比特位,比较费时。
3.select
可以监控的文件描述符数目是固定的,相对来说也较少(1024或2048),如果需要监控数值比较大的文件描述符,
就算所监控的描述符很少,如果分布的很稀疏也会效率很低,对于poll()
函数来说,就可以创建特定大小的数组来保存监
控的描述符,而不受文件描述符值大小的影响,而且poll()可以监控的文件数目远大于select。
4.对于select来说,所监控的fd_set在select返回之后会发生变化,所以在下一次进入select()之前都需要重新初始化需要
监控的fd_set,poll()
函数将监控的输入和输出事件分开,允许被监控的文件数组被复用而不需要重新初始化。
5.select()
函数的超时参数在返回时也是未定义的,考虑到可移植性,每次在超时之后在下一次进入到select之前都需要重新设置超时参数。
当然也不是说select就没有优点:
1.select()的可移植性更好,在某些Unix系统上不支持poll()
2.select() 对于超时值提供了更好的精度:微秒,而poll是毫秒。
epoll的优点:
1.支持一个进程打开大数目的socket描述符(FD)
2.IO效率不随FD数目增加而线性下降
3.使用mmap(文件映射)加速内核与用户空间的消息传递。
13.两主机间的通信怎么实现
TCP或者UDP通信过程
14.linux命里里面 chroot
(也就是改变程序执行时所参考的根目录位置)
df (linux中df命令可显示所有文件系统对i节点和磁盘块的使用情况。)
15.进程和线程的区别
进程是表示资源分配的基本单位,又是调度运行的基本单位。
线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。
仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上:
•进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
•进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
区别:
•进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
•线程是进程的一个实体,
是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,
只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
•一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进
程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就
等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进
行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
16.libpcap 的两个接受消息的函数是什么
const u_char *pcap_next(pcap_t *p,struct
pcap_pkthdr *h)
功能:捕获一个网络数据包
参数:p:libpcap句柄
h:数据包头
返回值:捕获数据包的地址。
int pcap_loop(pcap_t *p,int cnt ,pcap_handler
callback,u_char *user)
功能:循环捕获网络数据包,直到遇到错误或者满足退出条件:每次捕获一个数据包就会调用callback指示的回调函数,所以可以在回调
函数中进行数据包的处理操作。
17.TCP/IP 协议族的内容
分四层:链路层:主要实现Mac解析,设备间通信的功能,ARP,RARP。
网络层:主要实现网络上传输数据包的问题,IP协议,ICMP协议(控制报文协议),IGMP(互联网组管理协议)。
传输层:进程之间的通信方式,TCP,UDP。
应用层:程序与程序之间通信。FTP(文本传输协议),HTTP,SMTP(简单邮件传输协议),Telnet(远程网络访问协议)。
18.信号量的理解
信号量是一种睡眠锁。它是实现同步操作,防止竟态的方式之一。任何进程在对共享数据进行读写操作之前必须获得用来保护共享数据
的信号量,否则不提供访问权限,信号量会把这个访问进程放进一个等待队列中(这个等待队列是在信号量初始化过程中被初始化的),
然后让其进入睡眠状态。这是处理器重新调度,去执行其他进程的操作。保护共享数据的信号量被释放,被这个信号量放进等待队列的
进程会被激活,获得该信号量,然后对共享数据进行访问。
19.socket函数,各参数意义,建立tcp套接字应该怎么传参
20.网络分哪几层
TCP/IP分发分为四层:链路层,网络层,传输层,应用层
OSI/RM分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
21.mysql学过没,知道什么叫事件么
自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event
Scheduler),可以用做定时执行某些特定任务(例如:删除记录、
对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MySQL的事件调度器可以精确到每秒钟
执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实
时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
事件调度器有时也可称为临时触发器(temporal
triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)
是基于某个表所产生的事件触发的,区别也就在这里。
在使用这个功能之前必须确保event_scheduler已开启,可执行
22.对防火墙的理解
防火墙就是一种过滤塞,在网络的世界里,要由防火墙过滤的就是承载通信数据的通信包。
所有的防火墙都具有IP地址过滤功能。这项任务要检查IP包头,根据其IP源地址和目标地址作出放行/丢弃决定。根据IP地址做转发判断
在地址之外我们还可以对服务器的TCP/ UDP端口进行过滤。
23.TFTP与TCP的区别
TFTP是面向无连接的简单的文件传输协议,在传输文件时,客户端会向服务器发送命令请求,服务器收到后会直接将请求数据包发给客户端,
客户端接收到后会回复一个ACK应答包,如果没有回复,超时后服务器会再发送一次,三次都无应答服务器不再发送,过程和TCP差不多,但一
定要注意的是,TFTP是无连接的,没有连接和断开连接的过程。
TCP是面向连接的,在传输文件之前会有三次握手,传输结束后会有四次挥手。
24.tcp/ip 分几层,每层有什么协议
分四层:链路层:ARP,RARP协议
网络层:IP协议,
传输层:TCP,UDP
应用层:HTTP,Telnet,FTP,SMTP(简单的邮件传输协议)
25.线程同步/通信方式,进程间同步/通信方式
线程同步:临界区、互斥量、事件、信号量四种方式
1.
互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只
为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过
名字打开它。
2.
互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关
,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等
待进程和线程退出。
3.
通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问
许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办
法完成这个要求,信号灯对象可以说是一种资源计数器。
windows进程间同步方式有:1. 互斥量 mutex 2. 信号量 semaphore
3.事件 event 4.临界区 Critical Section 5.互锁函数
linux进程同步方式有:信号量、读写锁,互斥锁。
线程通信:# 锁机制:包括互斥锁、条件变量、读写锁
*互斥锁提供了以排他方式防止数据结构被并发修改的方法。
*读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
*条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量
始终与互斥锁一起使用。
#
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
#
信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
进程通信:管道、内存共享、消息队列、信号量、socket、信号,文件。
进程通信方法对比:
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于
线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。
26.bind有几个参数
int bind(int sockfd ,const struct sockaddr
*myaddr ,socklen_t addrlen);
功能:将本地协议地址与sockfd绑定。
参数:sockfd:socket套接字
myaddr:指向特定协议的地址结构指针
addrlen:该地址结构的长度
返回值:成功返回0,失败返回其他值。
27.解释优先级反转
优先级反转是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源。高优先任务由于因资源缺乏而处于受阻状态,一直等
到低优先级任务释放资源为止。而低优先级获得的CPU时间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该
中优先级的任务反而超过这两个任务而获得CPU时间。如果高优先级等待资源时不是阻塞等待,而是忙循环,则可能永远无法获得资源,
因为此时低优先级进程无法与高优先级进程争夺CPU时间,从而无法执行,进而无法释放资源,造成的后果就是高优先级任务无法获得资
源而继续推进。
29.UDP聊天是怎么实现的
聊天双方分别获取了对方的mac和IP后,通过创建socket套接字,从抓到的udp包中获取处理数据,再将要发送的数据组成udp包,发送给对方
实现的一种简单的聊天。
30.说一下udp tcp 通信的编程流程是什么,就是让你说客户端用什么函数,服务器用什么函数
udp流程:客户端用socket创建一个套接字,直接调用sendto发送数据,然后recvfrom等待服务器的应答信息。服务器首先调用socket函数创建
一个套接字,然后band()绑定到固定端口,然后调用recvfrom函数等待接受客户端的请求,接受到请求后调用sendto函数发送应答。
TCP流程:服务器首先调用socket函数创建一个套接字,然后band()绑定到固定端口,并且利用listen()函数将套接字由主动修改为被动,然
后调用accept函数等待客户端的连接信息,当客户端发出连接请求后,服务器与客户端经过三次握手建立连接,accept会从以连接队列中取
出一个已经建立好的连接,开始read()客户端发送的请求数据,write()将数据回复给客户端,当数据传输完毕后四次挥手与客户端断开
连接。
客户端进行通信,首先socket()创建一个套接字,然后向服务器发送connect()连接请求,请求的时候会发生三次握手,建立好连接后,
调用write()发送请求数据,read()接受应答数据,每次发送和接受后底层都会自动发送一个确认ACK数据包,接收完毕后调用colse()
断开连接。
31.为什么epoll比select高效
传统的select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。
epoll的IO效率不随FD数目增加而线性下降。
32.用shell实现一个死循环,判断一个文件是否存在,是的话输出存在,不是的话就输出不存在
33.用sql写一条语句实现搜索今天和明天的时间
--sql select * from tableNmae where
substr(date,0,8) = to_char(sysdate, 'yyyyMMdd')
34.static作用
1.隐藏性:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。也就是说你定义的一个全局变量和函数在另外
一个.c中也可以直接使用,但如果加上static就限定了定义的变量和函数只能在当前.c中使用。加上static可以在不同的文件中定义同名函数
和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏.
2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static
变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见
PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该
变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
3.static的第三个作用是默认初始化为0(static变量)
35.全局变量实在堆还是在栈
全局变量在全局区,既不在堆也不在栈
全局区存放全局变量,初始化的放在初始化的全局变量区,未初始化的放在未初始化的全局变量区
局部变量放在栈区
文字常量放在文字常量区
动态申请的空间存放在堆区。
36.volatile作用
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接
从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量
由别的程序更新了的话,将出现不一致的现象。
37.什么是操作系统
操作系统(Operating
System,简称OS)传统上是负责对计算机硬件直接控制及管理的系统软件。操作系统的功能一般包括处理器管理、存
储管理、文件管理、设备管理和作业管理等。当多个程序同时运行时,操作系统负责规划以优化每个程序的处理时间。
一个操作系统可以在概念上分割成两部分:内核(Kernel)以及壳(shell)。一个壳程序包裹了与硬件直接交流的内核:硬件<->内核<->壳<->应
用程序。但有些操作系统上内核与壳完全分开(例如Unix、Linux等),这样用户就可以在一个内核上使用不同的壳;而另一些的内核与壳关系
紧密(例如Microsoft Windows),内核及壳只是操作层次上不同而已。
38.bootloader的启动流程
Bootloader 的启动流程一般分为两个阶段:stage1和
stage2,下面分别对这两个阶段进行讲解:
(1)Bootloader 的stage1
在stage1中Bootloader 主要完成以下工作。
基本的硬件初始化,包括屏蔽所有的中断、设置 CPU的速度和时钟频率、RAM初始化、初始化LED、
关闭CPU内部指令和数据 cache灯。
为加载stage2准备RAM空间,通常为了获得更快的执行速度,通常把
stage2加载到RAM空间中来执行,因此必须为加载Bootloader的stage2准备
好一段可用的RAM空间范围。
拷贝stage2到RAM中,在这里要确定两点:①stage2的可执行映像在固态存储设备的存放起始地址和终止地址;②RAM空间的起始地址。
设置堆栈指针sp,这是为执行stage2的 C语言代码做好准备。
(2)Bootloader 的stage2
----在stage2中Bootloader 主要完成以下工作。 用汇编语言跳转到main入口函数
由于stage2的代码通常用C语言来实现,目的是实现更复杂
的功能和取得更好的代码可读性和可移植性。但是与普通C语言应用程序不同的是,在编译和链接
Bootloader 这样的程序时,不能使用
glibc库中的任何支持函数。
----
初始化本阶段要使用到的硬件设备,包括初始化串口、初始化计时器等。在初始化这些设备之前、可以输出一些打印信息。
-----检测系统的内存映射,所谓内存映射就是指在整个 4GB
物理地址空间中有指出哪些地址范围被分配用来寻址系统的RAM单元。
-----加载内核映像和根文件系统映像, 这里包括规划内存占用的布局和从
Flash上拷贝数据。
------设置内核的启动参数。
39.路由器是怎么实现转发的
当数据包发送到路由器上时,路由器首先解析一下数据包,如果目的IP和次路由器不在同一网段,直接将数据的目的Mac改为下一跳的Mac,
将源Mac改为自己的Mac,将数据传输给下一跳的路由器,如果目的IP和自己在同一个网段,将目的IP提取出来,然后查看路由表信息,是否保
存有目的IP的mac,如果有的话直接发送出去,如果没有的话,将数据包丢弃,给该网段所在的交换机发送了一个请求信息,交换机发现自己没
有主机对应的Mac,会向所有主机发送一个ARP请求,获取目的主机的Mac,当源IP等待回复信息超时后会再发送一次请求数据包,这次目的IP
所在的路由器有了目的IP对应的Mac可以直接将数据给他。
40.集线器和交换机和路由器的区别
集线器工作在物理层,交换机工作在数据链路层,路由器工作在网络层。
简单的说:一个路由功能,一个分散功能,一个共享功能,集线器占用宽带,另外两种不竞争,拥有独立的宽带。
集线器,就是我们常说的hub,用来电脑间数据传输,就像电插板一样,用的人多了,速度就慢了,因为共用一个带宽的
交换机,基本跟集线器一样的,只是速度不受人数影响,因为他是独立带宽
路由器,不像前面两个都是死的,它有自已的控制芯片,能在里面输宽带帐号以用来登录上网,还可以给下面的电脑设置各种网络权限,例如
你只有一个帐号,好几台电脑要上,就可以通过路由登录上网,其他电脑只要接到路由上就能上去,而前面两个则不行,除非用来登录的电脑
永远开着(这台电脑就相当于路由器了),其他电脑通过集线器连到这台电脑再出去。
集线器为共享方式,既同一网段的机器共享固有的带宽,传输通过碰撞检测进行,同一网段计算机越多,传输碰撞也越多,传输速率会变
慢;交换机每个端口为固定带宽,有独特的传输方式,传输速率不受计算机增加影响,其独特的NWAY、全双工功能增加了交换机的使用范围和
传输速度。
路由器的基本功能是把数据(IP
报文)传送到正确的网络,具体包括:IP 数据报的转发,包括数据报的寻径和传送;子网隔离,抑制广播风
暴;维护路由表,并与其它路由器交换路由信息,这是 IP 报文转发的基础;IP
数据报的差错处理及简单的拥塞控制;实现对 IP 数据报的过
滤和记帐等功能。
41.const和define的区别:
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,多次分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)一次,以后都指向他分配的内存。
(4)const
可以节省空间,避免不必要的内存分配。
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运
行过程中只有一份拷贝,而
#define定义的常量在内存中有若干个拷贝。
(5) 提高了效率。
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储
与读内存的操作,使得它的效率也很高。
42.堆和栈的区别:栈的申请效率比堆快,但是不受人为影响,由系统自动分配和回收,堆是由程序员自己申请的一块动态的空间,需要自己
申请和释放。堆区要比栈区大的多的多,跟硬盘容量有关,栈区一般为2M。
43.声明和定义的区别:
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的。 例如:extern int a
其中变量a是在别的文件中定义的。
(我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以
声明不会分配存储空间,只有定义时才会分配存储空间。)
44.指针和数组的区别:
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量
在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
加载中,请稍候......