c语言笔试题
- 格式:docx
- 大小:19.58 KB
- 文档页数:8
1.填空题(1)、请写出下列代码的输出内容#include <stdio.h>int main(void){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}答:10,12,120(2) char str[] = "\\\0";char *p = str;int n = 1000;请计算sizeof (str ) =____________sizeof ( p ) =______________sizeof ( n ) = ______________3 4 4(3) UCHAR *pucCharArray[10][10];typedef union unRec{ULONG ulIndex;USHORT usLevel[6];UCHAR ucPos;}REC_S;REC_S stMax,*pstMax;四字节对齐方式时:sizeof(pucCharArray) = ______, sizeof(stMax)=_______, sizeof(pstMax)=________,sizeof(*pstMax)=________.400 12 4 12(4) struct BBB{long lNum;char *pcName;short sDate;char cHa[2];short sBa[6];}*p;p = 0x100000;p + 0x1 = 0x____(unsigned long)p + 0x1 = 0x______(unsigned long *)p + 0x1 = 0x______(char *)p + 0x1 = 0x______100018 100001 100004 100001(5)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(6)#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;char d;long a;};struct tagTest1 stT1;struct tagTest2 stT2;struct tagTest3 stT3;printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));return 0;}#pragma pack()(编译选项结束)请问输出结果是:_________12 12 16(7)enum ENUM_A{X1=2,Y1,Z1 = 6,A1,B1};enum ENUM_A enumA = Y1;enum ENUM_A enumB = B1;请问enumA = ____; enumB = ______;3 8(8)以下程序的输出结果是________.#include <stdio.h>int fun(int x,int y){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;k = fun(j, m);printf("%d,", k);k=fun(j, m);printf("%d\n", k);return;}8 17(9)以下程序的输出结果为________#define CIR(r) r*r /*请注意这种定义的缺陷,不允许这么定义*/void main(){int a = 1;int b = 2;int t;t = CIR(a + b);printf("%d\n", t);return;}5(10)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 1004002.改错题(1)下面程序把"hello"这个字符串输出,请指出其中的错误。
void Test(void){char pcArray[10];strncpy(pcArray,"hello",5);printf("%s\n",pcArray);return;}strncpy没有把中止符NULL写入数组中(2)如下程序用于把"系统备板工作异常"字符串打印出来,请指出其中的错误:void PrintErrInfo(void){char acMsg[16];strcpy(acMsg,"系统备板工作异常");printf("%s",acMsg);return;}每个汉字占两个字节,空间不足,字符串结尾还有'\0'(3)如下函数实现打印字符串"hello world"的功能,请指出错误:#define BUFFER_SIZE 256void GetMemory(char *pszBuf){if(NULL == pszBuf){ASSERT(0);return ;}pszBuf = (char *)malloc(BUFFER_SIZE);return;}void Test(void){char *pszBuf = NULL;GetMemory(pszBuf);if(NULL == pszBuf){return ;}strcpy(pszBuf, "hello world\r\n");printf("%s", pszBuf);free(pszBuf);return;}函数要返回指针就需要传进去指针的地址(4)本题不考虑魔鬼数字问题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;unsigned char g = 0;AddFunc((unsigned int)e,(unsigned int)f,(unsigned int *)&g);printf("%d ",g);}g是一个字节的变量,将g的地址强制转换成四个字节unsigned int地址,导致写内存越界(5)找出下面题目中的错误#define ID_LEN 32struct STR_A{char aucID[ID_LEN];int iA;}struct STR_B{char *paucID;int iB;}// 该函数将pstB内的paucID指向结构stA的aucIDvoid funcA(struct STR_A stA, struct STR_B *pstB){pstB->paucID = stA.aucID;}main(){STR_A stA = {0};STR_B stB;strcpy(stA.aucID, “12345”);funcA(stA, &stB);printf(“%s\n”, stB.paucID);}funcA传入的stA的参数是一个值拷贝,pstB指向的是堆栈中的地址。
(6)指出下面程序的错误VOID B(ULONG *p){*p = 66 * 10000;return;}VOID A(){unsigned short a =10*1000;B((ULONG *)(&a));return;}字符越界/溢出7、请找出下面代码中的所有错误(题目不错,值得一看)说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”#include"string.h"main(){char*src="hello,world";char* dest=NULL;int len=strlen(src);dest=(char*)malloc(len);char* d=dest;char* s=src[len];while(len--!=0)d++=s--;printf("%s",dest);return 0;}答:方法1:一共有4个错误;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; //尾部要加’\0’printf("%sn",dest);free(dest); // 使用完,应当释放空间,以免造成内存汇泄露dest = NULL;//防止产生野指针return 0;}方法2:(方法一需要额外的存储空间,效率不高.)不错的想法#include <stdio.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;}8、请问下面程序有什么错误?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;答: 把循环语句内外换一下。