一、 选择题(答案为一个或多个)
1、对于栈中的元素进行引用,复合下列哪些规则()
A:LIFO B:LILO C:FILO D:FIFO
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; B、1; C、3; D、7; E、9;
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;
}
在其它函数中调用f(1),f(2),f(4),的返回值依次是:
A:10 B:20 C:30 D:0
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]中的值应该是什么()
A:0 B:1 C:0或1 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、软件需求分析阶段的测试手段一般采用()。
A 总结 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
13、enum{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 .包含oss的Lib库 B: 定义一个常量 C.不包含oss的Lib库
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原语 B:B树 C:进程上下文 D:临界区加锁
17、对栈S进行下列操作:push(1), push(2), pop( ), pop( )。则此时栈顶元素是[ ]
A:1B:2C:0D: 不确定
18、switch(c)中的c不能是哪种数据类型[ ]
A:char B:long C:unsigned D:double E:float
19、在Windows95环境下,定义数组:int **a[2][3]:则数组a所占用的内存单元为[ ]
A:6字节 B:24字节 C:48字节 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
A:a,b,cB:b,a,c C:b,c,a D:c,b,a
22、对下列关键字序列用快速排序进行排序时,速度最快的情形是[ ]
A:{25、23、30、17、21、5、9} B:{21、9、17、30、25、23、5}
C:{21、25、5、17、9、23、30} D:{5、9、17、21、23、25、30}
23、在下列叙述中,错误的一条是[ ]
A:操作系统是用户与计算之间的接口;
B:程序的并发执行,使程序失去了顺序执行时具有的封闭性和可再现性,程序与程序的执行不再一一对应。
C:进程从一个状态到别一个状态的转换,都是靠使用不同的原语来实现。
D:在单CPU的系统中,任何时刻处于就绪状态的进程有多个,而且,只有处于就绪状态的进程经调度程序选中后方可进入运行状态。
24、下面关于内容存管理的说法哪种是正确的[ ]
A:页式内存管理存在严重的碎片问题
B:段式内存管理不存在抖动问题
C:分区式内存管理既存在碎片问题,又存在抖动问题
D:段页式内存管理既减少了碎片问题,又减少了抖动问题
二、简答题
1、const 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类型为一个字节,取值范围是[-128,127],unsigned char [0 ,255]
3、ASSERT()是干什么用的
解答:
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 常量
(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东
西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
7、在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”?
解答:
C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字
与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo , 而C++编译器则会产生像
_foo_int_int 之类的名字。
C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。
8、void 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");将使程序崩
溃。
9、char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
解答:
可能是乱码。
因为GetMemory 返回的是指向“栈内存”
的指针,该指针的地址不是 NULL,但其原
现的内容已经被清除,新内容不可知。
10、void 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)内存泄漏
11、void 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)语句不起作用。
12、1.下面的代码错在哪里?
#include<string.h>
char * Func(void){
char p[10];
strcpy(p,”11”);
return p;
}
解答:局部变量不能作为地址指针返回。
13、5、请描述软件工程中的瀑布模型?
解答:
五、编写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为指向函数的指针。