您的当前位置:首页正文

c面试题及答案

2023-11-03 来源:步旅网
c面试题及答案

1、局部变量能否和全局变量重名

答:能,局部会屏蔽全局。要用全局变量,需要使用\"::\"

局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

2、如何引用一个已经定义过的全局变量 答:extern

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern 方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

3、全局变量可不可以定义在可被多个.C文件包含的头文件中为什么

答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错

4、语句for( ;1 ;)有什么问题它是什么意思 答:和while(1)相同。

5、do……whi le和while……do有什么区别 答:前一个循环一遍再判断,后一个判断以后再循环 6、请写出下列代码的输出内容 以下是引用片段: #include main() {

int a,b,c,d;

a=10;

b=a++; //先将a的值赋值给b 后,结束该语句时a的值将增1. c=++a; d=10*a++;

printf(\"b,c,d:%d,%d,%d\",b,c,d); return 0; }

答:10,12,120

7、static全局变量与普通的全局变量有什么区别 static局部变量和普通局部变量有什么区别 static函数与普通函数有什么区别

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

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

9、设有以下说明和定义:

typedef union {long i; int k[5]; char c;} DATE;//共用体以最大的存储区作为共同的存储区域。

struct data { int cat; DATE cow; double dog;} too; DATE max;

则语句 printf(\"%d\data)+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

10、队列和栈有什么区别 队列先进先出,栈后进先出 11、写出下列代码的输出内容 以下是引用片段: #include int inc(int a) {

return(++a); }

int multi(int*a,int*b,int*c) {

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 \} main() { int a;

show(multi,10,&a); return 0; } 答:110

12、请找出下面代码中的所有错误

说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为

以下是引用片段: 1、#include\"string.h\" 2、main() 3、{

4、 char*src=\"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];

“dcba”10、 while(len--!=0) 11、 d++=s--; 12、 printf(\"%s\13、 return 0; 14、} 答: 方法1:

以下是引用片段: int main() {

char* src = \"hello,world\"; int len = strlen(src);

char* dest = (char*)malloc(len+1);//要为分配一个空间 char* d = dest;

char* s = &src[len-1];//指向最后一个字符 while( len-- != 0 ) *d++=*s--; *d = 0;//尾部要加 printf(\"%s \

free(dest);// 使用完,应当释放空间,以免造成内存汇泄露 return 0;

} 方法2:

以下是引用片段: #include #include main() {

char str[]=\"hello,world\"; int len=strlen(str);

char t; for(int i=0; i { t=str[i];

str[i]=str[len-i-1]; str[len-i-1]=t; }

printf(\"%s\return 0; }

1.-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) 答案:63

2.用两个栈实现一个队列的功能要求给出算法和思路! 设2个栈为A,B, 一开始均为空. 入队:

将新元素push入栈A; 出队:

(1)判断栈B是否为空;

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B; (3)将栈B的栈顶元素pop出;

这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。3.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么

函数名: atol

功能: 把字符串转换成长整型数 用法: long atol(const char *nptr); 程序例:

以下是引用片段: #include

#include int main(void) { long l;

char *str = \"98765432\"; l = atol(lstr);

printf(\"string = %s integer = %ld \return(0); }

13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现c用宏定义,c++用inline

14.直接链接两个信令点的一组链路称作什么 PPP点到点连接

15.接入网用的是什么接口 16.voip都用了那些协议 17.软件测试都有那些种类 黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口

18.确定模块的功能和模块的接口是在软件设计的那个队段完成的 概要设计阶段 19.

enum string

{x1,x2,x3=10,x4,x5,}x; 问x= 0x801005,0x8010f4 ; 20.

unsigned char *p1; unsigned long *p2;

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

p2+5= ; 选择题:

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

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

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

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 找错题:

25.请问下面程序有什么错误

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[i][j][k]=0;

把循环语句内外换一下 26.

以下是引用片段: #define Max_CB 500

void LmiQueryCSmd(Struct MSgCB * pmsg) {

unsigned char ucCmdNum; ......

for(ucCmdNum=0;ucCmdNum { ......; } 死循环

27.以下是求一个数的平方的程序,请找出错误: #define SQUARE(a)((a)*(a)) int a=5; int b;

b=SQUARE(a++); 28.

以下是引用片段:

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; } ....... } 问答题:

29.IP Phone的原理是什么 IPV6

30.TCP/IP通信建立的过程怎样,端口有什么作用 三次握手,确定是哪个应用程序使用该协议

31.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种

32.列举5种以上的电话新业务 1.设计函数int atoi(char *s)。 int atoi(char *s) {

char sign; char sign_val = 1; int val = 0; int n = 0; /* skip spaces */ while (isspace(*s)) s;

if (*s == '-' || *s == ' ') /* skip '-' and ' ' sign */ {

sign = *s; if (sign == '-') sign_val = -1;

s; }

/* when goes here, it is not space or sign */ while ((*s != '\\0') && isdigit(*s)) {

val = 10 * n (*s - '0'); n = val; s ; }

if (*s != '\\0') {

printf( \"non digit in your input!!\\n\"); exit(-1); }

/* non error occured */ return (sign_val * val); }

2.int i=(j=4,k=8,l=16,m=32); printf(\"%d\输出是多少? 结果为: 32.(注释:主要考的是逗号运算)

3.解释局部变量、全局变量和静态变量的含义。

局部变量包括函数的形参,包含在函数体或者语句块内的变量,局部变量的生存期在退出函数或语句块后结束。

全局变量是指在所有函数和语句块之外的变量,它对于整个程序均可见,全局变量的生存期与程序的生存期相同.

静态变量指由要害字static声明的变量,它的作用域和其他变量一样,由它所在的位置决定,如在函数体或语句块中声明,则只在函数体或语句块可见,其他地方均不可见.它的生存期与程序相同.

4.解释堆和栈的区别。简述如下:

栈上分配的内存,由系统自动分配,系统会自动收回.假如需要动态分配内存,则只能通过malloc/new 在堆上分配的内存,使用完毕后,通

过free/delete来释放内存。

5.论述含参数的宏与函数的优缺点。

含参数的宏优点:省去了函数调用的开销,运行效率高. 含参数的缺点:

由于宏本质上是字符串的替换,所有可能会由于一些参数的副作用导致得出错误的结果.

如:

#define max(a, b) ( ((a) > (b)) ? (a) : (b) ) 假如程序中出现这样的调用: max(a , b);

将导致a被计算2次,从而可能得到错误的结果,而函数调用不会出现这种问题.另外,假如程序中有多次宏替换的话,可能导致代码体积变大.函数的优点是:

没有带参数宏可能导致的副作用,计算的正确性较宏更有保证. 函数调用的缺点:

函数调用需要一些参数,返回地址等入栈,出栈的开销,效率没有宏函数高.

因篇幅问题不能全部显示,请点此查看更多更全内容