现在的位置: 首页 > 综合 > 正文

C语言常见面试题

2018年05月19日 ⁄ 综合 ⁄ 共 6318字 ⁄ 字号 评论关闭

一、 选择题(答案为一个或多个)

1、对于栈中的元素进行引用,复合下列哪些规则()

ALIFO   BLILO   CFILO   DFIFO

2、单链表的每个结点中包括一个指针link,它指向该结点的后继结点。现要将指针q指向的新结点插入到指针p指向的单链表结点之后,下面的操作序列中哪一个是正确的?()

A:  p->link = q->link; q = p->link;

B:  p->link = q; q->link = p->link;

C:  q->link = p->link; p->link = q;

D:  q = p->link; p->link = q->link;

3、在一种语言中,运算符是从右向左结合的(例如:a+b+c =a+(b+c))下面表达式“7-(16/(3+1)*2)-4”的结果是()

A-1;   B1;   C3; D7; E9

4、程序的局部变量存在于(B)中,全局变量存在于(A)中,动态申请数据存在于()中

A:数据段  B:堆栈   C:堆空间

5、循环链表指()

A:最后一个节点的指针域总是指向链表头       B:可疑自由膨胀的链表

C:链表含有指向上一级节点的指针域           D:以上都不是

6、下列是一个C语言函数:

   int f (int a)

   int b;

   switch (a)

   {

     case 1 : b = 10;

     case 2 : b = 20;

     case 3 : b = 30;

     default : b = 0;

   }

   return b;

}

在其它函数中调用f1),f2),f4),的返回值依次是:

 A10   B20   C30  D0

7、进程和线程的最主要区别在于:()

A:进程是UNIX下的概念,线程是Windows下的概念;

B:进程的效率比线程低;

C:在进程中可以创造线程,但线程中不能生成进程;

D:进程有自己的运行空间,线程的运行空间是共享的

8、如下代码:

  unsigned int ulBuf[10];

  int I;

  unsigned char ucInfo[10];

  for (I = 0;I<10;I++)

  {

ulBuf[I] = I+1;

ucInfo[I] = 0;

}

sprintf(ucInfo,”%s”,ulBuf);

请问ucInfo[0]中的值应该是什么()

A0    B1    C01     D:不确定

9、下面程序的运行结果是多少?()

 main () {

char chr = 127;

int sum = 200;

chr += 1;

sum +=chr;

printf(“sum = %d\n”,sum);

return(0);

}

A: 327     B:328    C:99    D:72

11软件需求分析阶段的测试手段一般采用()。

总结   B 阶段性报告  C 需求分析评审   D 不测试

12、有如下的Hash函数:

unsigned  short  hashf  (unsigned  short  key) { return  (key  >>  4)  %  256 }    

hashf(16)hashf(256)的值[   ]

A: 1,16     B: 8,32   C:  4,15   D: 1,32

13enum{A ,B ,C ,D ,E ,K =8 , J , M}; 请说出D=[   ]

A: 3   B: 4    C: 5   D: 6   E :7

14、下面的代码中的含义是什么[    ]

#ifndef  _oss_LIB_H_      

#define  _oss_LIB_H_       

#endif

A .包含ossLib库    B: 定义一个常量      C.不包含ossLib库   

D.防止头文件被重复引用

15、下面程序的运行结果是多少?[   ]

#include  <string.h>

main( ){   char  chr  =  127;    int  sum   = 200;     

chr  +=  1;    sum  +=  chr;    pfintf( “sum=%d/n”,sum);    return  0 ; }             

A :327    B: 328   C: 199   D: 72

16、以下手段哪些可用于进程间的同步与互斥[      ]

A:信号量与PV原语   BB树    C:进程上下文     D:临界区加锁

17、对栈S进行下列操作:push(1), push(2), pop( ), pop( )。则此时栈顶元素是[    ]

A1B2C0D: 不确定

18switch(c)中的c不能是哪种数据类型[     ]

Achar   Blong   Cunsigned    Ddouble   Efloat

19、在Windows95环境下,定义数组:int **a[2][3]:则数组a所占用的内存单元为[    ]

A6字节    B24字节   C48字节   D:不能确定

20、类型定义:       chair  S[3] =”AB”     char *p;      在执行了语句p=s之后,*(p+2)的值是[    ]

A:‘B’ B:字符‘B’的地址    C:‘\0D:不确定     E:以上答案均不正确

21、下面对宏的定义和使用,哪些是错误的?[    ]

A#define   RECTANGLE_AREA(a, b)  (a * b)    

B#define  RECTANGLE_AREA(a,b)  ( a )*  ( b )

C#define  INTI_RECT_VALUE( a, b )     

D#define  MBUF_CLEAR_FLAG(pstMBufM, ulflagM)

((pstMEufM)-stUserTagData.stCommonInfo.ulFlag  &=( ~(ulFlagM)  ))

21、下面二叉树前序遍历的顺序是[    ]

            a

                      ╱ ╲

b     c

Aa,b,cBb,a,c        Cb,c,a      Dc,b,a 

22、对下列关键字序列用快速排序进行排序时,速度最快的情形是[     ]

A:{252330172159}        B:{219173025235

C:{212551792330}        D:{591721232530

23、在下列叙述中,错误的一条是[    ]      

A:操作系统是用户与计算之间的接口;

B:程序的并发执行,使程序失去了顺序执行时具有的封闭性和可再现性,程序与程序的执行不再一一对应。

C:进程从一个状态到别一个状态的转换,都是靠使用不同的原语来实现。      

D:在单CPU的系统中,任何时刻处于就绪状态的进程有多个,而且,只有处于就绪状态的进程经调度程序选中后方可进入运行状态。

24、下面关于内容存管理的说法哪种是正确的[    ] 

A:页式内存管理存在严重的碎片问题   

B:段式内存管理不存在抖动问题     

C:分区式内存管理既存在碎片问题,又存在抖动问题      

D:段页式内存管理既减少了碎片问题,又减少了抖动问题

二、简答题

1const char*, char const*, char*const的区别?

解答:

把一个声明从右向左读。 

char  * const cp;  ( * 读成 pointer to )  cp is a const pointer to char 

const char * p;    p is a pointer to const char; 

char const * p;    同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

2下面这个程序执行后会有什么错误或者效果:
 #define MAX 255
 int main()
{
   unsigned char A[MAX],i;
   for (i=0;i<=MAX;i++)
      A[i]=i;
}

解答:
MAX=255 
数组A的下标范围为:0..MAX-1,这是其一..
其二.i循环到255,循环内执行:
  A[255]=255;
这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时,
由于unsigned char的取值范围在(0..255),i++以后i又为0..无限循环下去.
注:char类型为一个字节,取值范围是[-128127]unsigned char [0 ,255]

3ASSERT()是干什么用的

解答:

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序: 
...... 
ASSERT( n != 0); 
k = 10/ n; 
...... 
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。 
assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

4、头文件中的 ifndef/define/endif 干什么用?
解答:防止该头文件被重复引用。

5、#include <filename.h> 和 #include “filename.h” 有什么区别?
解答:

对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h
对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h

6、const 有什么用途?(请至少说明两种)
解答:

1)可以定义 const 常量
2const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东
西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

7、在C++ 程序中调用被 编译器编译后的函数,为什么要加 extern “C”? 
解答:

C++语言支持函数重载,语言不支持函数重载。函数被C++编译后在库中的名字
语言的不同。假设某个函数的原型为: void foo(int x, int y);
该函数被编译器编译后在库中的名字为_foo , 而C++编译器则会产生像
_foo_int_int 之类的名字。
C++提供了连接交换指定符号extern“C”来解决名字匹配问题。

8void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test 函数会有什么样的结果?
解答:

程序崩溃。
因为GetMemory 并不能传递动态内存,
Test 函数中的 str 一直都是 NULL
strcpy(str, "hello world");将使程序崩
溃。

9char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
解答:

可能是乱码。
因为GetMemory 返回的是指向栈内存
的指针,该指针的地址不是 NULL,但其原
现的内容已经被清除,新内容不可知。

10void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?
解答:
1)能够输出hello
2)内存泄漏

11void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?
解答:

篡改动态内存区的内容,后果难以预
料,非常危险。
因为free(str);之后,str 成为野指针,
if(str != NULL)语句不起作用。

121.下面的代码错在哪里?    

#include<string.h>     

char *  Func(void){    

char   p[10];     

strcpy(p,”11”);      

return  p;

}

解答:局部变量不能作为地址指针返回。

135、请描述软件工程中的瀑布模型?

解答:

五、编写strcpy 函数(10 分)
已知strcpy 函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。
1)不调用C++/C 的字符串库函数,请编写函数 strcpy
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2
char *address = strDest; // 2
while( (*strDest++ = * strSrc++) != ‘\0’ ) // 2
NULL ;
return address ; // 2
}

六、编写用C语言实现的求n阶阶乘问题的递归算法
long int fact(int n)
{
  int x;
  long int y;
  if(n<0)   
   {
     printf("error!");
   }
  if(n==0)
     return 1;
  x=n-1;
  y=fact(x);
  return (n*y);

}

七、编程实现删除有序数组中的重复元素?

八、编程实现双向链表和单向链表插入一个node操作。

小知识:(必须掌握)

c指针 
int *p[n];-----指针数组,每个元素均为指向整型数据的指针。
int (*)p[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。
int *p();----------函数带回指针,指针指向返回的值。
int (*)p();------p为指向函数的指针。

抱歉!评论已关闭.