文档名称 文档密级
C语言编程基础考试
[考前说明]本题目中不考虑头文件引用问题(假定已经包含正确的头文件),C语言的标准函数都可用;如果不特别说明,
假定程序运行环境为:操作系统Windows 2000, VC6.0编译环境,缺省为四字节对齐,X86(80586)CPU处理器(32位小字节序处理器). 一、单选题
1、 给出以下定义:
char acX[ ]= \
char acY[ ]= {'a','b','c','d','e','f','g'};
则正确的叙述为( )
A) 数组acX和数组acY等价 B) 数组acX和数组acY的长度相同 C) 数组acX的长度大于数组acY的长度 D) 数组acX的长度小于数组Y的长度
2、 void example(char acHello[])
{
printf(\ return; }
void main()
{
char acHello[] = \ example(acHello); return;
}
的输出是( )
A 4 B 5 C 6 D不确定
3、 以下叙述中不正确的是( )
A) 在不同的函数中可以使用相同名字的变量 B) 函数中的形式参数是在栈中保存
C) 在一个函数内定义的变量只在本函数范围内有效
D) 在一个函数内的复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)
4、 设有如下定义:
unsigned long pulArray[] = {6, 7, 8, 9, 10}; unsigned long *pulPtr; 则下列程序段的输出结果为( ) pulPtr = pulArray;
1
文档名称 文档密级
*(pulPtr + 2) += 2;
printf (\
A)8,10 B)6,8 C)7,9 D)6,10
5、 有以下程序段
char acArr[]= \ char *pcPtr;
for(pcPtr = acArr; pcPtr < acArr + 5; pcPtr++) {
printf(\ }
return;
输出结果是( )
A) ABCD B) A C) E D) ABCDE B D BCDE C C CDE D B DE E A E
6、 void example( )
{
int i;
char acNew[20];
for(i = 0; i < 10; i++) {
acNew[i] = '0'; }
printf(\ return; }
的输出为( D )
A 0 B 10 C 11 D不确定
7、 switch(c)中的c的数据类型可以是char、long、float、unsigned、bool. ( )
A. 正确 B. 错误
8、 全局变量可以定义在被多个.C文件包含着的头文件中。( )
A. 正确 B. 错误
9、 struct stu
{
int num; char name[10];
2
文档名称 文档密级
int age; };
void fun(struct stu *p) {
printf(\ return; }
void main() {
struct stu students[3]={ {9801,\ {9802,\ {9803,\ fun(students + 2); return; }
输出结果是( )
A) Zhang B)Zhao C) Wang D) 18
10、 以下程序运行后,输出结果是( )
void main( )
{
char *szStr = \ szStr += 2;
printf(\ return; }
A cde B 字符c的ASCLL码值 C \这个常串中字符c所在的地址 D 出错
11、 在X86下,有下列程序
#include
union {
int k; char i[2]; }*s,a; s = &a;
s->i[0] = 0x39; s->i[1] = 0x38;
printf(\ }
3
文档名称 文档密级
输出结果是( )
A) 3839 B) 3938 C) 380039 D) 不可预知
12、 网络上传输的字节序默认是大字节的,如果主机是小字节序,在网络通信时则须进行字节序转换;如果主机是大字节序,为了程序的一致性及可移植性,最好也在程序中加上字节序转换的操作(空操作)。( ) A. 正确 B.错误
13、 void example()
{
int i;
char acNew[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for(i = 0; i < 10; i++)
{
acNew[i] = '0';
}
printf(\ return; }
的输出为:( )
A 0 B 10 C 11 D不确定
14、 在函数内部定义的变量(静态变量、寄存器变量等特殊变量除外)的内存是在栈内存中,所以在定义函数内部的变量的时候,一定要保证栈不能够溢出。如果临时变量 占用空间较大,应该使用内存申请的方式,这样该变量指向的内存就是在堆内存中了。( ) A. 正确 B. 错误
15、 局部变量可以和全局变量重名,编译的时候不会出现错误,但一旦不小心,
就可能导致使用错误变量,所以在定时局部变量的时候,不要和全局变量重名。( )
A. 正确 B. 错误
16、 设有以下宏定义: #define N 3
#define Y(n) ((N+1)*n) /*这种定义在编程规范中是严格禁止的*/ 则执行语句:z = 2 * (N + Y(5 + 1));后,z的值为( ) A) 出错 B) 42 C) 48 D)54
17、 int *(*ptr)();
则以下叙述中正确的是( ) A) ptr是指向一维组数的指针变量
4
文档名称 文档密级
B) ptr是指向int型数据的指针变量
C) ptr是指向函数的指针,该函数返回一个int型数据
D) ptr是指向函数的指针,该函数的返回值是指向int型数据的指针
18、 0x12345678 在采用BigEndian中内存的排列顺序是______,在采用LittleEndian内存中的排列顺序是______. (答案从左到右内存地址依次增加)
A.12 34 56 78 B.34 12 78 56 C.78 56 34 12 D.56 78 12 34
19、 请指出下面程序问题
#define MAX_LEN 254
unsigned char Array[MAX_LEN]; int main(int argc, char *argv[]) {
int i;
for ( i = 0; i <= MAX_LEN; i++ ) {
Array[i] = i; }
return; }
程序的错误为():
A、i = MAX_LEN时,数组越界 B、argv参数形式错误
C、i = MAX_LEN时,赋值溢出 D、return无返回值
20、 #define BUFFER_SIZE 256
void GetMemory(char **ppszBuf) {
if (NULL == ppszBuf) {
ASSERT(0); return ; }
*ppszBuf = (char *)malloc(BUFFER_SIZE); return; }
void Test(void)
{
char *pszBuf=NULL; GetMemory(&pszBuf);
5
文档名称 文档密级
strcpy(pszBuf, \ printf(\ free(pszBuf); return;
}
下面说法正确的是(): A、pszBuf的值永远为NULL; B、malloc内存后没有判断是否成功; C、strcpy拷贝越界;
D、GetMemory无法将申请的内存地址传递给pszBuf;
21、 如下程序用于把\字符串打印出来:
void PrintBLUE() {
char pcBlue[] = {'b','l','u','e'}; printf(\ return;
}
下面描述正确的是():
A、pcBlue数组初始化时没有字符串结束符; B、数组pcBlue定义时必须指明长度;
22、 请指出下面这段代码中的错误:
unsigned long FUNC_B ( unsigned long ulCount ) {
unsigned long ulSum = 0 ;
while( 0 <= ulCount ) {
ulSum += ulCount ; ulCount--; }
return ulSum ; }
void test(void)
{
unsigned long ulTotal = 0; ulTotal=FUNC_B(10); printf(\}
下面描述正确的是():
6
文档名称 文档密级
A、while循环判断始终为真; B、test打印输出55;
C、循环体内在执行2的32次方后,ulSum开始溢出翻转;
23、 此函数实现把32位IP地址(网络序)以字符串的方式打印出来:
char *IpAddr2Str(unsigned long ulIpAddr)
{
char szIpAddr[32];
unsigned long ulLocIpAddr = ntohl(ulIpAddr);//把网络序转话为主机序 (void)VOS_sprintf(szIpAddr, \ (ulLocIpAddr >> 16) & 0xff, (ulLocIpAddr >> 8) & 0xff, ulLocIpAddr & 0xff);
return szIpAddr; }
下面描述正确的是():
A、数组szIpAddr空间不够;
B、函数返回局部数组szIpAddr变量地址; C、输出的IP地址次序颠倒;
24、 如下程序用于把\字符串返回:
char *GetBLUE(void) {
char* pcColor ; char* pcNewColor;
pcColor = \
pcNewColor = (char*)malloc(strlen(pColor)); if(NULL == pcNewColor) {
return NULL;
}
strcpy(pcNewColor, pcColor); return pcNewColor; }
下面描述正确的是:
A、字符串“blue”存放在栈内; B、函数GetBLUE返回局部变量地址;
C、内存空间分配长度不够,strcpy函数拷贝越界;
25、 如下代码实现中,FUNC_A为每毫秒定时执行的函数,在该函数中,需要
实现每TIME_INTERVAL毫秒执行一次DO_Something()的操作。 请指出段代码中的错误: #define ULONG unsigned long #define TIME_INTERVAL 200
7
文档名称 文档密级
void DO_Something(void) {
/*....*/ return; }
void FUNC_A ( )
{
static ULONG ulPreCall = 0 ; ULONG ulNowInMsHigh = 0 ; ULONG ulNowInMsLow = 0 ;
( VOID ) VOS_Tm_Now( &ulNowInMsHigh, &ulNowInMsLow ) ; /* 获取当前的时间,以毫秒为单位,用64bits表示, ulNowInMsHigh为高32位, ulNowInMsLow为低32位*/
if( ( 0 == ulPreCall ) || ( ulNowInMsLow >= (ulPreCall + TIME_INTERVAL) ) ) {
ulPreCall = ulNowInMsLow; }
else {
return ; }
DO_Something(); return ; }
A、函数FUNC_A第一次被调用时,不执行Do_Something()操作; B、函数FUNC_A功能在一段时间后失效,因为ulNowInMsLow溢出翻转; C、ulPreCall不应该定义为静态变量;
26、 下面的代码中,函数Test执行完毕后,希望输出1。请指出错误:
void VarInit(unsigned char *pucArg) {
*pucArg = 1; return; } void Test()
{
unsigned long ulGlobal; VarInit(&ulGlobal); printf(\ return; }
下面描述正确的是:( )
8
文档名称 文档密级
A.给VarInit( )函数传递的参数类型错误 B.printf()输出格式错误
C.传给VarInit( )中参数pucArg的值为空指针
27、 #define OK 0
#define ERR 1
#define ERROR (-1) #define BUFFER_SIZE 256
char *GetMemory(unsigned long ulSize) {
char *pcBuf = NULL; pcBuf = (char *)malloc(ulSize); if(NULL == pcBuf) {
return ERROR; }
return pcBuf; }
void Test(void) {
char *pszBuf = NULL;
pszBuf = GetMemory(BUFFER_SIZE); if(NULL != pszBuf) {
strcpy(pszBuf, \ printf(pszBuf); free(pszBuf); }
return;
}
如下描述正确的是:
A、pszBuf指向的内存不能超过255
B、GetMemory函数的异常分支返回了-1,是一个非法地址 C、GetMemory中异常分支没有释放空间;
D、pcBuf为局部指针,指向的内存将在GetMemory被调用后释放
28、 void AddFunc (unsigned int a, unsigned int b, unsigned int * c)
{
*c = a + b; }
void main(void) {
unsigned char e = 200;
9
文档名称 文档密级
unsigned char f = 100; unsigned char g = 0;
AddFunc((unsigned int)e,(unsigned int)f,(unsigned int *)&g); printf(\
}
下面说法正确的是():
A 对g进行类型转换导致函数调用时写内存越界; B 对e、f进行类型转换导致函数调用时写内存越界; C 函数调用时不能改变g的值。
29、 #define NULL 0
#define MEM_OK 0 #define MEM_ERR 1
enum ENUM_STAT_ITEM {
STAT_ITEM0, STAT_ITEM1,
STAT_ITEM_BUTT };
typedef struct tag_PERM_COUNT_STAT_INFO {
unsigned short stat_item ; unsigned shrot number; } _SPermCountStatInfo;
_SPermCountStatInfo pcsi[STAT_ITEM_BUTT] = {
{ STAT_ITEM0, 16000}, { STAT_ITEM1, 50000} , }
unsigned long *pulStatDataBuffer = NULL; unsigned short AllocPermMemory(void)
{
unsigned short usBufferSize = 0; unsigned short usLoop = 0;
for(usLoop = 0; usLoop < STAT_ITEM_BUTT; usLoop ++)
{
usBufferSize += pcsi[usLoop].number ; }
pulStatDataBuffer = (unsigned long*)malloc(sizeof(unsigned long) * usBufferSize); if (NULL == pulStatDataBuffer) {
return MEM_ERR; }
10
文档名称 文档密级
return MEM_OK; }
下面说法正确的是():
A unsigned short 类型不能表示循环体中将16000与50000相加的和66000 B 数组pcsi的number域是unsigned short类型,不能表示50000这么大的数字 C 循环条件应该改为usLoop<=STAT_ITEM_BUTT
30、 设有如下定义: BOOL gstatusA = FALSE; BOOL gstatusB = TRUE; int gvarA = 100;
int gvarB = 100; 则执行main函数后后gvarA和gvarB的值分别为( ) BOOL CheckA() { if(gstatusA) {
gvarA++; } else {
gvarA--; }
return gstatusA; }
BOOL CheckB() {
if(gstatusB) {
gvarB++; } else {
gvarB--; }
return gstatusB;
} int main(int argc, char* argv[]) { if(CheckA() && CheckB() )
{ }
printf(“Status OK”);
11
文档名称 文档密级
return 0; }
A.99和100 B.99和101 C.99和99 D.101和99
31、 请问下面函数中1、2、3应该填入什么语句才合理?( )
A、不添,不添,不添
B、free(pMsg); , free(ptmpMsg);,不添
C、free(pMsg);,free(ptmpMsg);,free(ptmpMsg); D、不添,free(pMsg);,free(ptmpMsg);
E、free(pMsg); ,free(pMsg); ,free(ptmpMsg); F、不添,不添,free(ptmpMsg); #define COMM_MSG_LEN 100 char *get_message_buffer(int malloc_len) {
char *ptr=NULL;
ptr=(char *)malloc(malloc_len) return ptr; }
int func_test(void) {
int malloc_len =COMM_MSG_LEN; char *pMsg=NULL; char *ptmpMsg=NULL;
pMsg=get_message_buffer(malloc_len); if(NULL == pMsg) { }
____1___
return ERROR;
fillMessage(pMsg);
sendMessage(pMsg);
ptmpMsg=get_message_buffer(malloc_len); if(NULL == ptmpMsg) { }
12 ____2___
return ERROR;
}
文档名称 文档密级
fillMessage(ptmpMsg); sendMessage(ptmpMsg); free(pMsg); ____3___ return OK;
32、 请问下面题目中a,b,c输出值为多少?( )
A、10,210,30 B、100,210,300 C、110,210,310 D、100,210,30 E、110,200,30
#include
#define func(A) A++;\\ A *= 10;
int main(int argc, char* argv[]) {
int a = 10; int b=20; int c=30; if(a > 10) func(a); if(b >= 20) func(b); if(c>30)
{
func(c); }
33、 #define MAX_MEM_SIZE 100
int GetMem(int iLen, void **ppMem) {
if(NULL==ppMem) {
return -1;
13 }
printf(\return 0;
}
文档名称 文档密级
if(iLen<=0) {
return 0; }
else if(iLen *ppMem=malloc(iLen); return iLen; } else { *ppMem=malloc(MAX_MEM_SIZE); return MAX_MEM_SIZE; } } void test() { char *pMyMem; int i; int j; i = GetMem(i, (void**)&pMyMem); if(NULL!=pMyMem) { for(j=0; j pMyMem[j]=0; } } } 下面说法正确的有;( ) A、因为pMyMem未初始化,test函数中的GetMem可能会返回-1; B、因为i未初始化,test函数中GetMem可能会返回比MAX_MEM_SIZE大的值; C、因为pMyMem未初始化,for循环内的赋值操作可能会导致写内存异常; D、无论pMyMem, i, j为何值时,test函数内都不会出现写内存异常; 34、 #define MAX_MEM_SIZE 100 int GetMem(int iLen, void **ppMem) { if(iLen<0) 14 文档名称 文档密级 { return -1; } else if(0==iLen) { return 0; } else if(iLen *ppMem=malloc(iLen); return iLen; } else { *ppMem=malloc(MAX_MEM_SIZE); return MAX_MEM_SIZE; } } void test() { char *pMyMem; int i,k; unsigned int j; j=GetMem(i, &pMyMem); if(j>0) { for(k=0; k pMyMem[k]=0; } } } 下面说法正确的有: A、只要将pMyMem初始化为NULL,可以避免test函数内的for循环出现写内存异常; B、虽然i和pMyMem均未初始化,只要将if(j>0)改为if((0 C、虽然i和pMyMem均未初始化,只要将test函数内的for循环比较由k D、上面三种说法都不对。 15 文档名称 文档密级 35、 #define BUF_LEN 2048 struct AAA { ULONG ulLen; //指示buf中实际占用字节数 CHAR buf[BUF_LEN]; //存储缓冲区 }; 函数PrintBufLen的作用是打印出结构体中的buf的实际占用长度,有下面两种实现方法: 方法一: VOID PrintBufLen(struct AAA* pBuf) { if(NULL == pBuf) { printf(\ return; } printf(\ return; } 方法二: VOID PrintBufLen(struct AAA Buf) { printf(\ return; } 以下说法只有一个正确的是:( ) A:优选方法一,原因是以指针作为入参,减少函数参数压栈的系统开销。 B:优选方法二,原因是可以不做入参合法性判断,不容易出错。 C:两种方法差不多,可以任意选择。 D:以上说法都不对。 36、 void main(void) { unsigned char a =200; unsigned char b =100; unsigned char c = 0; c=a+b; printf(\} 下列程序的执行结果为(C) A 300 300 B 44 44 C 300 44 16 文档名称 文档密级 D 44 300 37、 有如下宏定义和结构定义 #define MAX_SIZE A+B struct _Record_Struct { unsigned char Env_Alarm_ID :4; unsigned char Para1 :2; unsigned char state; unsigned char avail:1; } * Env_Alarm_Record ; pointer = (struct _Record_Struct *)malloc(sizeof(struct _Record_Struct) * MAX_SIZE) ; 当A=2, B=3时pointer分配( )个字节的空间。 注意:机器是按照4字节对齐 A)20 B)15 C)11 D) 9 38、 在X86,VC++6.0环境下,有下列程序 #include int main() { } 17 char c; unsigned char uc; unsigned short us; c = 128; uc = 128; us = c + uc; printf(%us = c + (short)uc; printf(\ us = (unsigned char)c + uc; printf(%us = c + (char)uc; printf(\return 0; 文档名称 文档密级 输出结果是( ) A) 0x0 0x0 0x100 0xff00 B) 0x0 0x100 0x100 0xff00 C) 0x0 0x100 0x100 0x0 D) 0x0 0x0 0x100 0x0 39、 #include \ unsigned short *sum(unsigned char a, unsigned char b) { } unsigned short s = 0; s = a + b; return &s; int main() { } unsigned short *p=NULL; unsigned char a=1, b=2; p = sum(a, b); printf(\printf(\return 0; 程序执行结果是( ) A.1+2=0 B.1+2=3 C.1+2=NULL D.不可预测 二、多选题 40、 void GetMemory(char **ppcChar, int iLength) { if(NULL == ppcChar) { return; } *ppcChar = (char *)malloc(iLength); return; } void main( ) { char *szStr = NULL; GetMemory(&szStr, 100); if(NULL != szStr) { 18 文档名称 文档密级 strcpy(szStr, \ printf(szStr); } return; } 下面描述正确的是(): A、iLength应该判断是否大于0; B、程序中使用魔鬼数字; C、当szStr不为空时,没有释放分配的内存; D、printf(szStr)无法输出字符串 41、 下面程序期望输出str = hello world: char * GetStr(char *p) { p = \ return p; } void main() { char *str = NULL; if(NULL != GetStr(str)) { printf(\ } return; } 下面描述正确的是: A、Str始终为NULL; B、函数GetStr返回值始终不为空; C、该程序无法得到预期的输出结果,因为GetStr函数无法将字符串地址带给实参; 42、 下面程序期望得到 global_variable的值,并打印出来。 unsigned char global_variable; void GetGlobalAddr(unsigned char *p) { p = &global_variable; } void main() { unsigned char *temp = NULL_PTR; GetGlobalAddr(temp); 19 文档名称 文档密级 printf(\ return; } 下面说法正确的是(): A 对p强制类型转换错误; B 调用函数时,局部变量p存在于栈中; C p值的改变不会影响temp; D 调用函数后,temp的值被改变为global_variable的地址。 43、 #define MAX_LEN 2 _UC *ConvertCode(_UC *p_byte, _UC num) { _UL i = 0; _UC strTemp[MAX_LEN]; if (NULL == p_byte) { return NULL; } memcpy(strTemp, p_byte, MAX_LEN); return (_UC *)strTemp; } void main(void) { _UC str[MAX_LEN]; _UC *p; str[0] = 0x12; str[1] = 0x34; p=ConvertCode(str, MAX_LEN); printf(\ return 0; } 下面说明中,描述正确的是(): A、输入参数p_byte为空指针 B、函数ConvertCode返回值没有判断 C、没有判断p_byte空间和MAX_LEN的大小 D、返回局部变量地址 44、 #include 20 文档名称 文档密级 char *get_buffer(int msg_len) { char *ptr=NULL; int len =msg_len; ptr=(char *)malloc(len); if(NULL == ptr ) { return NULL; } return ptr; } int main(int argc, char* argv[]) { int msg_len ; char *pMsg; if(TRUE == MaxMsgFlag) { msg_len = MaxMsgLen; } pMsg = get_buffer(msg_len); if(NULL != pMsg ) { strcpy(pMsg,\ printf(\ free(pMsg); } return 0; } 上面的程序存在问题,下面描述正确的是( ) A、函数get_buffer没有判断入参msg_len是否大于等于0。 B、函数main中pMsg没有赋初值 C、函数main中msg_len没有赋初值 D、函数main中free(pMsg)后,没有把pMsg置为NULL。 45、 请指出下面程序的错误:( ) void Test(void) { char *szStr = (char *) malloc(100); if(NULL == szStr) { return; } strcpy(szStr, \ 21 文档名称 文档密级 free(szStr); if(NULL != szStr) { strcpy(szStr, \ printf(szStr); } return; } A、strcpy没有将结尾符拷贝到szStr中 B、对释放空间的指针进行拷贝操作 C、printf随机打印 D、没有返回值 46、 定义结构体时有下面几种说法,请指出正确的___ A、结构体中的每个部分,最好进行四字节对齐; B、结构体的总长度最好是四字节对齐; C、结构中成员的存放不用考虑字节对齐情况; 47、 下列定义正确的有( ) A: char *pcPtr = \ B: char pc[4]= \ C: char pc[] = \ D: char pc[] = 'abcd'; E: char pc[] = {'a','b','c','d','\\0'}; F: char pc[] = 'a' 'b' 'c' 'd'; 三、填空: 48、 char *pcColor = \ char acColor[] = \strlen(pcColor) = _____ strlen(acColor) = _____ sizeof(pcColor) = _____ sizeof(acColor) = _____ 5 5 4 6 49、 char str[] = \ char *p = str; int n = 1000; 请计算 sizeof (str ) = ____________ sizeof ( p ) = ______________ sizeof ( n ) = ______________ 3 4 4 22 文档名称 文档密级 50、 UCHAR *pucCharArray[10][10]; typedef union unRec { ULONG ulIndex; USHORT UCHAR usLevel[6]; ucPos; }REC_S; REC_S stMax,*pstMax; 四字节对齐方式时: sizeof(pucCharArray) = ______, sizeof(stMax)=_______, sizeof(pstMax)=________,sizeof(*pstMax)=________. 400 12 4 12 { 51、 typedef union unHead UCHAR aucSrc [6]; struct tagContent { UCHAR ucFlag[3]; ULONG ulNext; }Content; }HEAD_S; 32CPU,VC编译环境下: 在强制一字节对齐情况下,请指出sizeof(HEAD_S) = ________; 在强制二字节对齐情况下,请指出sizeof(HEAD_S) = ________; 在强制四字节对齐情况下,请指出sizeof(HEAD_S) = ________; 7 8 8 52、 UCHAR *pszTest = \ UCHAR aucTest[] = \ 请问 sizeof(pszTest) = _____ , sizeof(*pszTest) = ______, sizeof(aucTest) = ______. 4 1 6 53、 struct BBB { long lNum; char *pcName; short sDate; char cHa[2]; short sBa[6]; }*p; p = 0x100000; 23 文档名称 文档密级 p + 0x1 = 0x____ (unsigned long)p + 0x1 = 0x______ (unsigned long *)p + 0x1 = 0x______ (char *)p + 0x1 = 0x______ 100018 100001 100004 100001 54、 在4字节对齐的情况: typedef struct tagRec { long lA1; char cA2; char cA3; long lA4; long lA5; } REC_S; void main(int argc, char *argv[]) { REC_S stMax ; printf(\ return; } 输出结果为: sizeof(stMax)=____ 16 55、 void main () { unsigned long ulA = 0x11000000; printf(\ return; } 输出结果为: 0 56、 在VRP中,实现了strncpy类似的函数,定义如下: #define CHAR char #define ULONG unsigned long #define VOID void CHAR *VOS_strncpy(CHAR *pcDest, const CHAR *szSrc, ULONG ulLength) { CHAR *pcPoint = pcDest; if(( NULL == szSrc ) || ( NULL == pcDest ) )) 24 文档名称 文档密级 { return NULL; } while(ulLength && (*pcPoint = *szSrc))/*这里采用了在判断语句中赋值的方式(*pcPoint = *szSrc),建议尽量不使用*/ { pcPoint++; szSrc++; ulLength--; } if(!ulLength) { *pcPoint = '\\0'; } return pcDest; } VOID main(VOID) { CHAR szStrBuf[ ] = \ CHAR szStrBuf1[ ] = \ strncpy(szStrBuf, \ VOS_strncpy(szStrBuf1, \ printf(\} 输出结果为: ABCD567890 ABCD 57、 char acHello[] = \ char acNew[15] = {0}; strcpy(acNew,acHello); strlen(acNew) = _____ sizeof(acHello) = ______ 5 12 58、 typedef struct tagTest { UCHAR ULONG }TEST_S; 25 ucFlag; ulLen; 文档名称 文档密级 TEST_S test[10]; 四字节对齐方式时: sizeof(TEST_S) = ______, sizeof(test)________. 8 80 59、 struct tagAAA { unsigned char ucId:1; unsigned char ucPara0:2; unsigned char ucState:6; unsigned char ucTail:4; unsigned char ucAvail; unsigned char ucTail2:4; unsigned long ulData; }AAA_S; 问:AAA_S在字节对齐分别为1、4的情况下,占用的空间大小是多少? 9 12 60、 #pragma pack(4)/*编译选项,表示4字节对齐*/ int main(int argc, char* argv[]) { struct tagTest1 { short a; char d; long b; long c; }; struct tagTest2 { long b; short c; char d; long a; }; struct tagTest3 { short c; long b; char d; long a; }; struct tagTest1 stT1; struct tagTest2 stT2; 26 文档名称 文档密级 struct tagTest3 stT3; printf(\ return 0; } #pragma pack()(编译选项结束) 请问输出结果是:_________ 12 12 16 61、 enum ENUM_A 1 7 62、 以下程序的输出结果是________. #include static int m = 0; static int i = 2; i += m + 1; m = i + x + y; return m; } void main() { int j = 4; int m = 1; int k; k = fun(j, m); printf(\ k=fun(j, m); printf(\ return; } 27 { X1, Y1, Z1 = 5, A1, B1 }; enum ENUM_A enumA = Y1; enum ENUM_A enumB = B1; 请问 enumA = ____; enumB = ______; 8 17 文档名称 文档密级 63、 以下程序的输出结果为________ #define CIR(r) r*r /*请注意这种定义的缺陷,不允许这么定义*/ void main() { int a = 1; int b = 2; int t; t = CIR(a + b); printf(\ return; } 5 64、 char acHello[] = \ char acNew[15] = {0}; memcpy(acNew,acHello,12); strlen(acNew) = _____ sizeof(acHello) = _____ 5 12 65、 union tagAAAA { struct { char ucFirst; short usSecond; char ucThird; }half; long lI; }number; struct tagBBBBB { char ucFirst; short usSecond; char ucThird; short usForth; }half; struct tagCCCC { 28 文档名称 文档密级 struct { char ucFirst; short usSecond; char ucThird; }half; long lI; }; 在字节对齐为1下,sizeof(union tagAAAA)、sizeof(struct tagBBBBB)、sizeof(struct tagCCCC)是____ ____ _____ 在字节对齐为4下,sizeof(union tagAAAA)、sizeof(struct tagBBBBB)、sizeof(struct tagCCCC)是____ ____ _____ 4 6 8 8 8 12 66、 struct tagABC { char cB; short sC; char cD; long lA; }*pAbc; pAbc = 0x100000; 那么pAbc+0x100 = 0x_________; (ULONG)pAbc + 0x100 = 0x_________;(ULONG *)pAbc + 0x100 = 0x_________;(char *)pAbc + 0x100 = 0x_______; 100C00 100100 100400 100100 67、 unsigned long FUNC_C ( unsigned long ulAction ) { unsigned long ulResult = 0 ; switch ( ulAction ) { case ACTION_A: { ulResult += 1 ; break ; } case ACTION_B: { 29 文档名称 文档密级 ulResult += 1 ; } default: { ulResult += 1 ; } } printf( \ return ulResult ; } 当输入为ACTION_B时,输出结果为: ulResult = _________; 2 68、 下面的代码中,函数Test执行完毕后,打印的结果是 _____。 unsigned long g_ulGlobal = 0; void GlobalInit(unsigned long ulArg) { ulArg = 0x01; return; } void Test() { GlobalInit(g_ulGlobal); printf(\ return; } 0 69、 以下程序的输出的结果是___________ int x = 3; void incre(); void main() { int i; for (i = 1; i < x; i++) { incre(); } return; } 30 文档名称 文档密级 void incre() { static int x = 1; x *= (x + 1); printf(\ return; } 2 6 70、 以下程序的输出的结果是___________ #pragma pack(4)/*四字节对齐*/ int main(int argc, char* argv[]) { unsigned char puc[4]; struct tagPIM { unsigned char ucPim1; unsigned char ucData0:1; unsigned char ucData1:2; unsigned char ucData2:3; }*pstPimData; pstPimData = (struct tagPIM *)puc; memset(puc, 0, 4); pstPimData->ucPim1 = 1; pstPimData->ucData0 = 2; pstPimData->ucData1 = 3; pstPimData->ucData2 = 4; printf(\ return 0; } #pragma pack()/*恢复缺省对齐方式*/ 01 26 00 00 71、 enum NEW_SERV_ID { NSID_SERV_NULL = 0, ... NSID_SERV254 = 254, NSID_SERV255 , NSID_BUTT 31 文档名称 文档密级 }; unsigned char GetNsid(char nsid) { return (nsid); } GetNsid(NSID_SERV_NULL) = _____; GetNsid(NSID_SERV255) = _______; GetNsid(NSID_BUTT) = __. 0 , 255, 0 三、指出下列程序中导致不能出现预期结果的唯一错误(不考虑编程规范错误) 72、 下面程序把\这个字符串输出,请指出其中的错误。 void Test(void) { char pcArray[10]; strncpy(pcArray,\ printf(\ return; } strncpy没有把中止符NULL写入数组中 73、 如下程序用于把\系统备板工作异常\字符串打印出来,请指出其中的错 误: void PrintErrInfo(void) { char acMsg[16]; strcpy(acMsg,\系统备板工作异常\ printf(\ return; } 每个汉字占两个字节,空间不足,字符串结尾还有'\\0' 74、 如下函数实现打印字符串\的功能,请指出错误: #define BUFFER_SIZE 256 void GetMemory(char *pszBuf) { if(NULL == pszBuf) { ASSERT(0); return ; } 32 文档名称 文档密级 pszBuf = (char *)malloc(BUFFER_SIZE); return; } void Test(void) { char *pszBuf = NULL; GetMemory(pszBuf); if(NULL == pszBuf) { return ; } strcpy(pszBuf, \ printf(\ free(pszBuf); return; } 函数要返回指针就需要传进去指针的地址 75、 如下函数实现打印字符串\的功能,请指出错误: char *GetMemory(void) { char pcBuf[] = \ return pcBuf; } void Test(void) { char *pcStr = NULL; pcStr = GetMemory(); if(NULL == pcStr) { printf(\ return; } else { printf(\ } return; } 要打印的字符串存在于栈内存,可能不会正确打印 76、 下面程序把\这个字符串输出,请指出其中的错误。 void PrintBLUE(void) 33 文档名称 文档密级 { char* pcColor ; char pcNewColor[5]; pcColor = \ strncpy(pcNewColor, pcColor,4); printf(\ return; } strncpy没有把中止符NULL写入数组中 77、 请指出下面程序错误的地方: LONG A() { if (条件1) { return; } return VOS_OK; } VOID B() { if (A()) { DoSomeThing1(); } else { DoSomeThing2(); } return; } return语句少了返回值 78、 本题不考虑魔鬼数字问题 void AddFunc (unsigned int a, unsigned int b, unsigned int * c) { } { *c = a + b void main(void) unsigned char e = 200; unsigned char f = 100; 34 } 文档名称 文档密级 unsigned char g = 0; AddFunc((unsigned int)e,(unsigned int)f,(unsigned int *)&g); printf(\ g是一个字节的变量,将g的地址强制转换成四个字节unsigned int地址,导致写内存越界 79、 找出下面题目中的错误 #define ID_LEN struct STR_A { } 32 char aucID[ID_LEN]; int iA; struct STR_B { } // 该函数将pstB内的paucID指向结构stA的aucID void funcA(struct STR_A stA, struct STR_B *pstB) { pstB->paucID = stA.aucID; char *paucID; int iB; } main() { STR_A stA = {0}; STR_B stB; strcpy(stA.aucID, “12345”); funcA(stA, &stB); printf(“%s\\n”, stB.paucID); } funcA传入的stA的参数是一个值拷贝,pstB指向的是堆栈中的地址。 80、 以下函数主要目的是为一个全局空间迅速填充指定字符garbage,请指出有错误的地方 #define MAX_LEN 20 char pBuffer[MAX_LEN]; unsigned char garbage=0x4E; int longfill(const char *pv, unsigned char b) 35 { 文档名称 文档密级 unsigned short val = 0; /* 用4 个字节拼成一个长字 */ val = (b<<24) | (b<<16) | (b<<8) | b; } int main(int argc, char* argv[]) { } int i = 0; int len = MAX_LEN/4; for(i=0;i return 0; *(unsigned long *)pv= val; return 0; val溢出 81、 指出下面程序的错误 VOID B(ULONG *p) { *p = 66 * 10000; return; } VOID A() { unsigned short a = 10*1000; B((ULONG *)(&a)); return; } 字符越界/溢出 82、 #define MAX_LEN 2 void ConvertCode(_UC *p_byte, _UC num) { _UL i = 0; for (i = 0 ; i < num; i++) { p_byte[i] = ((p_byte[i] & 0xF0) >> 4) | ((p_byte[i] & 0x0F) << 4); } } void main(void) 36 { 文档名称 文档密级 _UC * str = NULL_PTR; ConvertCode(str, MAX_LEN); } ConvertCode函数没有进行入参的有效性判断 83、 请指出下面函数的性能问题 #define MAX_PRAM_LENGTH 10000 typedef struct { unsigned char ucCommand; unsigned short usLength; unsigned char Para[MAX_PRAM_LENGTH]; } DEBUG_MSG; void PringDebugMsg (DEBUG_MSG DebugMessage) { int i; printf(\ for (i = 0 ; i < DebugMessage.usLength && i < MAX_PRAM_LENGTH; i++) { } printf(\ } 使用超大结构数组变量作为参数,有可能将栈顶爆,导致程序异常。 37