段错误出现的几种情况
一般是访问了不存在的内存或越界访问。
0、指针未初始化就访问
1、访问NULL或0地址指针(尤其注意0地址)
2、数组越界访问(一般C不会报错,但不可预料结果)
static关键字
局部变量用static修饰
int fun(int a,int b)
{
static m=0,i=2;
m+=2;
i+=a+b;
return m+i;
}
int main()
{
.....//两次调用fun(a,b)
}
多次调用fun(int,int)时,其中的static变量只在第一次被初始化,从第二次起都继承上次调用后的值
字节对齐
- 结构体变量的首地址能够被其对齐字节数大小所整除。
- 结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足。
- 结构体的总大小为结构体对齐字节数大小的整数倍,如不满足,最后填充字节以满足。
举例:默认结构体以最大成员类型字节数对齐
struct A {
int a;
char b;
short c;
};//大小为8
struct B {
char b;
int a;
short c;
};//大小为12
与int *p[4]等价的表达式
A int *p
B int *(p[4])
C int (*p)[4]
D int p[4]
首先看int *p[4] ,根据运算符优先级[]>*,所以p先与[]结合构成数组,然后int 代表int类型指针,本质为声明一个int类型指针的数组
根据优先级()>*,所以B中p先与[]结合表示p为数组,p[]再与结合表示int指针数组,所以答案为B
C中*先与p结合表示p为指针,再与[]结合表示数组指针
char *ptr = “abc”
执行ptr[0] = 'x’后,字符串会不会变为"xbc"?
答案是不一定的,题目没有讲明是在什么编译环境下,有的编译器是允许修改常量的。但在linux下gcc编译时不能的,"abc"相当于const char *类型,不能被指针修改。
Linux内存管理方式
- 分段式:分段式内存管理是将整体虚拟地址空间划分为多个段(包括代码段、数据段、栈区、堆区等等)。这种内存管理方式的好处是有利于对地址空间进行管理。
- 分页式:这种内存管理方式是将整体虚拟地址空间划分为很多个小的分页(默认4096字节为一页,每页数据量越小,地址空间利用率越高),分页式的作用是实现离散式存储,提高内存利用率。
- 段页式:这种内存管理方式就是分段式和分页式的集合,即先将地址分段,然后对每段分页。
传输层的主要作用
- 多路复用和分用。封装应用层数据给网络层,将网络层数据分发给应用程序。
- 寻址定位。通过端口号定位进程。
- 流量控制和拥塞控制。防止接收端速度太慢造成溢出和丢包的现象。
- 可靠的数据传输。
总结:弥补网络层的不足
内存申请的过程
DNS解析过程
IO接口多路复用了解多少
(听成了RO接口,以为是什么高端组件,没答上来)
select:
poll:
epoll: