1、找错
| void test1() { char string[10]; char* str1="0123456789"; strcpy(string, str1); } |
PS:使用strcpy函数的时候一定要注意前面目的数组的大小一定要大于后面字符串的大小,否则便是访问越界。
| void test2() { char string[10], str1[10]; for(i=0; i<10;i++) { str1[i] =’a’; } strcpy(string, str1); } |
PS:字符数组和字符串的最明显的区别就是字符串会被默认的加上结束符‘\0’。
| void test3(char* str1) { char string[10]; if(strlen(str1)<=10) { strcpy(string, str1); } } |
小结:上面的三个找错的函数,主要是考查对字符串和字符数组的概念的掌握以及对strcpy函数和strlen函数的理解。
2、找错
| DSN get_SRM_no() { static int SRM_no; int I; for(I=0;I<MAX_SRM;I++) { SRM_no %= MAX_SRM; if(MY_SRM.state==IDLE) { break; } } if(I>=MAX_SRM) return (NULL_SRM); else return SRM_no; } |
简单的阅读一下这个函数,可以大概的可以猜测出这个函数的功能是分配一个空闲的SRAM块。方法:从上次分配的RAM块后的RAM块开始检测SRAM每个RAM块,看是否是IDLE状态,如果是IDLE则返回当前的RAM块的号SRM_no.如果所有的RAM块都不是IDLE状态,则意味着无法分配一个RAM给函数调用者,返回一个表示没有RAM可分配的标志(NULL_SRM)。
经过上面的分析,则这里可以知道,这个函数的错误是for循环里面没有给SRM_no这个变量累加1.
3、写出程序运行结果
| int sum(int a) { auto int c=0; static int b=3; c+=1; b+=2; return(a+b+c); } void main() { int I; int a=2; for(I=0;I<5;I++) { printf("%d,", sum(a)); } } |
运行结果是:8,10,12,14,16,
在求和函数sum里面c是auto变量,根据auto变量特性知每次调用sum函数时变量c都会自动赋值为0.b是static变量,根据static变量特性知每次调用sum函数时变量b都会使用上次调用sum函数时b保存的值。
简单的分析一下函数,可以知道,若传入的参数不变,则每次调用sum函数返回的结果,都比上次多2.所以答案是:8,10,12,14,16,
| 4、func(1) = ? int func(int a) { int b; switch(a) { case 1: 30; case 2: 20; case 3: 16; default: 0; } return b; } |
在 case 语句中可能忘记了对变量b赋值。如果改为下面的代码:
| int func(int a) { int b; switch(a) { case 1: b = 30; case 2: b = 20; case 3: b = 16; default: b = 0; } return b; } |
5、a[q - p] = ?
| int a[3];
a[0]=0; a[1]=1; a[2]=2; int *p, *q; p=a; q=&a[2]; 很明显:a[q - p] = a[2] = 2; |
6、内存空间占用问题
定义 int **a[3][4], 则变量占有的内存空间为:16位系统24,32位编译系统中是48.
PS:公式:3 * 4 * sizeof(int **) .
7、程序编写
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
| void ResetTheTime(int *year,int *month,int *date,int *hour,int *minute,int*second) { int dayOfMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if( *year < 0 || *month < 1 || *month > 12 || |
0
顶一下0
踩一下