记录一些经典笔试题,温习一下 C语言啊
选择与简答
1、在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的后缀是 -p
没啥解释,-p 递归创建
2、UNIX系统中进程由三部分组成:进程控制块,正文段 ,数据段。意味着一个程序的正文与数据是可以分开的,目的是 可共享正文、可共享数据、可重入
3、64位系统以及64位编译器下
struct T
{
char a;
int *d;
int b;
int c:16;
double e;
};
T *p;
sizeof(p) == 8 指针所占内存空间与系统位数对应,64位的系统指针占8字节 ,32位的4字节
sizeof(*p) == 32 结构体内的字节对齐
sizeof(p->a) == 1 char型占一个字节
sizeof(p->e) == 8 double型占8字节
4、关键字static的作用
修饰函数,限制作用域,只能在本文件中调用
修饰局部变量,只能被定义一次,只能分配一次内存空间,改变变量的生命周期至程序运行结束
修饰全局变量,只能在本文件中调用
5、局部变量能否和全局变量重名
能,局部会屏蔽全局。要用全局变量,需要使用 “:: ”
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
6、程序的内存分配,即一个有c/c++编译的程序占用的内存分为几个部分
五个部分(3G用户态,另有1G内核态)
BSS段:静态数据区,存放静态变量和未初始化的全局变量
数据段:存放初始化的全局变量
代码段:代码+常量
堆
栈:自定义函数
7、堆和栈的区别
栈由OS管理进行分配空间和释放;堆由开发人员分配空间与释放,程序运行结束后可能由OS回收
栈使用一级缓存,调用完立刻释放;堆使用二级缓存,生命周期由虚拟机的垃圾回收算法决定(孤儿进程不一定被立刻回收,所以堆空间调用速度相对较低)。
程序题
约瑟夫环(数组解与单链表解)
有n个人围成一圈,顺序排号,从第一个报数(1到3),凡报到三的人退出圈子,问最后一个留下的是几号
数组解
#include<stdio.h>
int main()
{
int n,person,i=0;
int flag[1000] = {0};
int k=0;
printf("please input a number:\n");
scanf("%d",&n);
person = n;
while(person != 1)
{
if(flag[i] == 0)
{
k++;
if(k == 3)
{
k = 0;
flag[i] = 1;
person--;
}
}
i++;
if(n == i)
{
i = 0;
}
}
for(i=0;i<n;i++)
{
if(flag[i] != 1)
{
printf("the last one is %d\n",i+1);
}
}
return 0;
}
后续更新中….