C语言笔试考点

来源:互联网 发布:安卓e4a编程工具手机版 编辑:程序博客网 时间:2024/04/25 03:25
【C语言】
1、包含预定义头文件<>和“”的区别?
#include<>---表示引用标准类库路径
#include“”---表示引用当前程序路径

2、sprintf缓存溢出时的输出。
编译时编译器不会报错,但运行时有可能堆栈溢出,报错;
越界访问,发生在自己程序内部,则运行不报错,但会出现意料之外的问题;
如:

#include <stdio.h>
#include <string .h>
int main()  
{  
char src[50] = "abcdefghijklmnopqrstuvwxyz";  
char buf[10] = "";  
int len = sprintf(buf, "%s", src);  
printf("src=%s\n", src);  
printf("len=%d\n", len);  
printf("buf=%s\n", buf);  
return 0;  
}

这段代码,有明显的 缓冲区溢出的现象,编译后运行,我预期会报堆栈溢出 之类的错误,
没想到结果是如下:

src=klmnopqrstuvwxyz
len=26
buf=abcdefghijklmnopqrstuvwxyz
 
的确有溢出,但不报错是因为其越界访问只是发生在程序自己内存地址空间内
程序结果出现这个问题是因为src和buf的地址空间是相邻的,而且src的地址比buf高,当进行sprintf时,此函数直到遇到src字符串中的'\0'才会结束(除非程序崩溃),因此sprintf只将abcdefghij(你会发现其长度等于buf的长度)拷到buf中,而将后面的字符串klmnopqrstuvwxyz拷到src中(因为src与buf的地址相邻)。
所以在printf时,该函数也是通过'\0'判断结尾的,所以会输出abcdefghijklmnopqrstuvwxyz,而src的数据已被更改,所以是klmnopqrstuvwxyz;

3、自增,自减运算符;


4、malloc()、calloc()、realloc()的区别;
void *malloc(size_t size)
---在堆区分配一个长度为size字节空间的内存,该内存区域未初始化;
void *calloc(size_t nmemb, size_t size)
---在堆区分配nmemb个长度为size字节的连续空间,并将该区域初始化为0;
void *realloc(void *ptr, size_t size)
---在ptr指针所指向的内存空间中重新分配size字节大小;
如果新区域大小大于原有区域大小,则多申请到的区域未初始化;

5、指针,数组指针,指针数组,函数指针,指针函数;
指针 ------ 变量,存放变量的地址,举例:int *ptr
数组指针------ 数组首元素地址的指针,即是指向数组的指针。
例:int (*ptr)[10],【C陷阱与缺点 P38】该句声明了*ptr是一个拥有10个整形元素的数组,因此,ap就是一个指向这样数组的指针。
指针数组------ 数组元素全为指针的数组。
例:int *ptr_array[10],【C程序设计语言 P94】它表示ptr_array是一个具有10个元素的一维数组,其中数组的每个元素是一个指向int类型的指针。
也就是说,ptr_array[i]是一个int型的指针。
函数指针------ 指向一个函数的指针。例:int (*comp)(void *, void *),*comp代表一个函数,对该函数调用:(*comp)(v[i],v[left]);
指针函数------ 一个函数其返回值是一个指针。例:int *comp(void *, void *);

6、const限定符;

7、sizeof()
是一个一元运算符,非函数;
返回某数据类型或表达式的长度(单位:字节);

char --------- 1 byte
int  --------- 2/4 byte(16位系统,认为是2字节)
short int ---- 2 byte
long int ----- 4/8 byte
float -------- 4 byte
double ------- 8 byte
long double -- 16 byte

1byte(字节) = 8bit(位)

8、volatile关键字
作为指令关键字,确保本条指令不会因编译器的优化而省略,要求每次都直接去访问具体的内容。

9、逗号表达式
逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为:表达式1,表达式2
求解顺序为从左到右,先求解表达式1,再求解表达式2,并且表达式1的值被丢弃,整个逗号表达式的值是表达式2的值。

10、变长参数

11、静态变量

12、从变量的作用域角度看,变量可分为几种?
按照变量的作用域来分,变量可分为两种, 即局部变量和全局变量.
局部变量也称为内部变量.局部变量是在函数内作定义说明的.其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的.
全局变量也称为外部变量,它是在函数外部定义的变量. 它不属于哪一个函数,它属于一个源程序文件.其作用域是整个源程序. 

【数据结构与算法】
1、(单链表反转)写一个程序,储存1,2,3,然后写一个函数让其反转?
头插法

2、约瑟夫环

3、写程序,C字符串,this is a test!反转,结果为:test!a is this


4、写程序,输出所有小于N(N>0)的质数

5、用两个栈(Stack)S1,S2实现一个队列(Queue),描述算法
http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html
方法1:
入队时,将元素压入S1栈顶;
出队时,将S1所有元素压入S2,再将S2顶部元素作为出队元素;待出队后,再将S2所有元素倒回S1;
方法2:
入队时,判断栈S1是否为空,若不为空,则元素都在S1中,此时将元素直接入栈S1;若为空,则将S2所有元素倒回至S1,再将元素入栈S1;
出队时,判断栈S2是否为空,若不为空,则元素都在S2中,此时直接出栈S2顶部元素;若为空,则将S1所有元素倒回至S2,再出栈S2顶部元素;
方法3(优先推荐):
入队时,直接入栈S1;
出队时,判断栈S2是否为空,若不为空,直接出栈S2;若为空,则将S1所有元素倒回至S2,再出栈S2;

6、二叉树树的遍历方式

前序,中序,后序


【Linux应用 & 网络 & 操作系统 & 其他】

1、进程和线程的区别;

2、列举多线程同步互斥机制;


3、TCP/UDP---传输层协议
TCP(传输控制协议)---有链接,可靠,类似电话
UDP(用户数据报协议)---无连接,不可靠,类似对讲机

4、TCP/IP的三次握手和四次挥手
三次握手(Three-WayHandshake)即建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
在socket编程中,这一过程由客户端执行connect来触发,整个流程如下所示:SYN(Client)--->ACK+SYN(Server)--->ACK(Client)
四次挥手(Four-WayWavehand)即指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:FIN(Client)--->ACK(Server)--->FIN(Server)--->ACK(Client)

5、如何创建守护进程
a、创建子进程,父进程退出(孤儿进程);
b、在子进程中创建新会话,并是当前进程为新会话组组长;
c、改变当前工作目录,要求该目录不能被卸载;
d、重设文件权限掩码;
e、关闭文件描述符;

6、操作系统如何处理中断请求;

7、什么是字节对齐,为什么要对齐,不对其会产生什么后果?
为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”.
比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除.
字节对齐的作用不仅是便于cpu快速访问,提高cpu访问数据的效率,同时合理的利用字节对齐可以有效地节省存储空间。

8、大端模式小端模式
0 0
原创粉丝点击