C语言面试大集合

1、static有什么用途(至少说明两种)?
(1)限制变量的作用域
(2)设置变量的存储域

2、引用与指针有什么区别?
(1)引用必须被初始化,指针不必。
(2)不存在指向空值的引用,但是存在指向空值的指针。

3、描述实时操作系统的基本特性:
答:在特定时间内完成特定的任务,实时性与可靠性。

4、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
答:全局变量储存在静态数据库,局部变量在堆栈。

5、什么是平衡二叉树?
答:左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。左右子树深度相等。

6、堆栈溢出一般是由什么原因导致的?
答:没有回收垃圾资源。

7、什么函数不能声明为虚函数?
答:constructor。

8、冒泡排序算法的时间复杂度是什么?
答:O(n^2)。

9、写出float x 与“零值”比较的if语句。
答:if(x>0.000001&&x<-0.000001)

10、 Internet采用哪种网络协议?该协议的主要层次结构?
答:tcp/ip。 应用层/传输层/网络层/数据链路层/物理层。

11、Internet物理地址和IP地址转换采用什么协议?
答:ARP (Address Resolution Protocol)(地址解析協議)。

12、IP地址的编码分为哪俩部分?
答:IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分
哪些是网络位哪些是主机位。

13、用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出
C程序。
答:循环链表,用取余操作做。
for(i=0; i<N; i++)
{
if(i%M==0) printf("%d",M);
}

14、不能做switch()的参数类型是:
答:switch的参数不能为实数型。

15、局部变量能否和全局变量重名?
答:可以。,局部会屏蔽全局。要用全局变量,需要使用"::"
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不
会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,
比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环
体内。

16、如何引用一个已经定义过的全局变量?
答:extern。
可以用引用头文件的方式,也可以用extern关键字。如果用引用头文件方式来引用某个在
头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错。如果你用ex
tern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

17、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答:可以。
在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初
值,此时连接不会出错,即用extern来引用。

18、语句for( ;1 ;)有什么问题?它是什么意思?
答:没问题。和while(1)的作用相同。

19、do……while和while……do有什么区别?
答:前者先执行循环体,再判断条件;后者先判断条件,再执行循环体。

20、请写出下列代码的输出内容:
#include<stdio.h>
main()
{
int a,b,c,d;
a=10;//b=10
b=a++; //a=11
c=++a;//a=12,c=12
d=10*a++;//d=120,a=13
printf(“b,c,d:%d,%d,%d”,b,c,d);
return 0;
}
答:10,12,120.

21、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么
区别?static函数与普通函数有什么区别?
答:在同一个源文件的普通全局变量就是static全局变量。全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是
改变了它的存储方式即改变了它的
生存期
。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明
为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以
外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其
他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依
据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调
用中维持一份拷贝。

22、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存
在于( 堆)中。

23、设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:52_
解释:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所
以它的大小是20。
data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.
所以结果是 20 + 32 = 52。
当然…在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 =
20。

24、队列和栈有什么区别?
答:队列先进先出,栈后进先出。

25、写出下列代码的输出内容
#include<stdio.h>
int inc(int a)
{
return(++a);
}
int multi(inta,intb,intc)
{
return(c=a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int
,int
,int
);

void show(FUNC2 fun,int arg1, int*arg2)
{
INCp=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%d\n",*arg2);
}
main()
{
int a;
show(multi,10,&a);
return 0;
}
答:110。

26、请找出下面代码中的所以错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
1、#include"string.h"
2、main()
3、{
4、 charsrc=“hello,world”;
5、 char
dest=NULL;
6、 int len=strlen(src);
7、 dest=(char*)malloc(len);\
8、 char* d=dest;
9、 char* s=src[len];\
10、 while(len–!=0)
11、 d++=s–;\
12、 printf("%s",dest);\
13、 return 0;
14、}

答:方法一:
方法1:
int main(){
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要为\0分配一个空间
char* d = dest;
char* s = &src[len-1];//指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾部要加\0
printf("%s\n",dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
return 0;
}

方法二:
#include <stdlib.h>
#include <string.h>

main()
{
    char str[]="hello,world";
    int len=strlen(str);
    char t;
    for(int i=0; i<len/2; i++)
    {
        t=str[i];
        str[i]=str[len-i-1];
        str[len-i-1]=t;
    }
    printf("%s",str);
    return 0;
}

27、-1,2,7,28,?,126请问28和126中间那个数是什么?为什么?
答:第一题的答案应该是4^3-1=63
规律是n^3-1(当n为偶数0,2,4)
n^3+1(当n为奇数1,3,5)

28、用两个栈实现一个队列的功能?要求给出算法和思路!
答:设2个栈为A,B, 一开始均为空。队列实现效果:头删尾插(FIFO)。栈:在栈顶进行插入和删除(LIFO)。
入队:
将新元素push入栈A;
出队:
(1)判断栈B是否为空;
(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;
(3)将栈B的栈顶元素pop出;
这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。
思路:压入,倒出,再弹出。

29、在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?
答:atol。
功能:把字符串转换成长整行数。
用 法: long atol(const char *nptr);
程序例:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
long l;
char *str = “98765432”;
l = atol(lstr);
printf(“string = %s integer = %ld\n”, str, l);
return(0);
}

30、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
答:c用宏定义define,c++用inline。

31、直接链接两个信令点的一组链路称作什么?
答:PPP点到点连接。

32、接入网用的是什么接口?

33、voip都用了那些协议?

34、软件测试都有那些种类?
答:黑盒:针对系统功能的测试 。 白合:测试函数功能,各函数接口。

35、确定模块的功能和模块的接口是在软件设计的那个队段完成的?
答:概要设计阶段。

36、enum string
{
x1,
x2,
x3=10,
x4,
x5,
}X;
问:X= 0,1,11,2,13中的某一个;

37、unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问p1+5= 0x801005;
p2+5= 0x801014;

39、Ethternet链接到Internet用到以下那个协议?
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
答:B

40、属于网络层协议的是:
A.TCP;B.IP;C.ICMP;D.X.25
答:C

41、Windows消息调度机制是:
A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;
答:C

42、.unsigned short hash(unsigned short key)
{
return (key>>)%256;
}
请问hash(16),hash(256)的值分别是:
A.1.16; B.8.32; C.4.16; D.1.32
分析:首先我们不知道这道题的右移位数是多少,也不知道这道题是不是出题有问题,现在我们来看看答案
首先%256肯定不起作用,因为16%256移动一位以后都小于256,所以只要考虑key> > n即可

我们考虑16=10H,他右移可能的结果是
移动位数,结果
1 8
2 4
3 2
4 1
对比四个答案
A.1.16;B.8.32;C.4.16;D.1.32
A: n=4,带入key=256得到结果是16,match
B: n=1,带入key=256结果是128,不match
C: n=2,带入key=256结果是64,不match
D: n=3,带入key=256结果是16,不match

所以答案就是A,移动位数为4

43、请问下面程序有什么错误?

   int a[60][250][1000],i,j,k;
   for(k=0;k<=1000;k++)
    for(j=0;j<250;j++)
     for(i=0;i<60;i++)
      a[j][k]=0;

把循环语句内外换一下,i最外层,k最内层。

44、#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;


for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
…;
}
找错:死循环。ucCmdNun是unsigned char类型,最大到255。

45、以下是求一个数的平方的程序,请找出错误:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
答:a的值发生变化。

46、typedef unsigned char BYTE
int examply_fun(BYTE gt_len; BYTE *gt_code)
{
BYTE *gt_buf;
gt_buf=(BYTE *)MALLOC(Max_GT_Length);

if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR;
}

}
答:examply_fun函数参数不应是分号,要释放内存。

47、ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?
答:应用层
表示层
会话层
运输层
网络层
物理链路层
物理层
tcp/udp是属于运输层,
tcp/udp优缺点:
TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。
tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好。
udp: 不提供稳定的服务,包头小,开销小。

48、(void )ptr 和 ((void**))ptr的结果是否相同?其中ptr为同一个指针。
答:(void )ptr 和 ((void**))ptr值是相同的。

49、int main()
{
int x=3;
printf("%d",x);
return 1;
}
问函数既然不会被其它函数调用,为什么要返回1?
答:mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息。

50、要对绝对地址0x100000赋值,我们可以用
(unsigned int*)0x100000 = 1234;//地址强制转换
那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
*((void (*)( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)();
用typedef可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();//可理解为函数名换成了地址

51、已知一个数组table,用一个宏定义,求出数据的元素个数
#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))

52、面试题: 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?
答:进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。
每个线程有自己的堆栈。
DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?
以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃。

53、unsigned short A = 10;
printf("~A = %u\n", ~A);
char c=128;
printf(“c=%d\n”,c);
输出多少?并分析过程
第一题,~A =0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285。
第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128。

这两道题都是在考察二进制向int或uint转换时的最高位处理。
分析下面的程序:
void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);

}
int main()
{
char *str=NULL;

GetMemory(&str,100);

strcpy(str,"hello");

free(str);

if(str!=NULL)
{
    strcpy(str,"world");
}   
   
printf("\n str is %s",str);
getchar();

} 输出结果是什么?
答:输出结果是str is world。
因为free释放的只是str指向的内存空间,但是str的值还是存在的。所以一般free之后,有个好习惯就是将str=NULL。
这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。
当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些
),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用
内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你
是可以继续访问这块地址的,但最好不要这么做。

54、
sizeof()和初不初始化,没有关系;
strlen()和初始化有关。

55、char (*str)[20];/str是一个数组指针,即指向数组的指针./
char *str[20];/str是一个指针数组,其元素为指针型数据./

56、long a=0x801010;
a+5=?
0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值为8392720
,再加上5就是8392725罗

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值