问答题 阅读以下说明、C函数和问题,将解答写入答题纸的对应栏内。 {{B}}[{{/B}}说明1{{B}}]{{/B}} 函数test_f1(int m,int n)对整数m、n进行某种运算后返回一个整数值。 {{B}}[{{/B}}C函数1{{B}}]{{/B}} int test_f1(int m,int n) { int k; k=m>n? m:n; for(;(k% m! =0) ||(k% n! =0);k++); return k; } {{B}}[{{/B}}问题1{{B}}]{{/B}} (1)请写出发生函数调用test_f1(9,6)时,函数的返回值; (2)请说明函数test_f1的功能。 {{B}}[{{/B}}说明2{{B}}]{{/B}} 设在某C系统中为每个字符分配1个字节,为每个指针分配4个字节,sizeof(x)计算为 x分配的字节数。 函数test_f2()用于测试并输出该C系统为某些数据分配的字节数。 {{B}}[{{/B}}C函数2{{B}}]{{/B}} void test_f2( ) { char str[] ="NewWorld"; char* p=str; char i ='/0'; void* ptr =malloc(50); printf("% d/t",sizeof(str)); printf("% d/n",sizeof(p)); printf("% d/t",sizeof(i)); printf("% d/n",sizeof(ptr)); } {{B}}[{{/B}}问题2{{B}}]{{/B}} 请写出函数test_f2()的运行结果。 {{B}}[{{/B}}说明3{{B}}]{{/B}} 函数test_f3(char s[])的功能是:将给定字符串s中的所有空格字符删除后形成的串保存在字符数组tstr中(串s的内容不变),并返回结果串的首地址。 {{B}}[{{/B}}C函数3{{B}}]{{/B}} char*test_f3 (const char s[]) { char tstr[50] = {'/0'}; unsigned int i, k=0; for (i =0;i<strlen(s);i++) if(s[i]! =") tstr[k++]=s[i]; return tstr; } {{B}}[{{/B}}问题3{{B}}]{{/B}} 函数test_f3()对返回值的处理有缺陷,请指出该缺陷并说明修改方法。
【正确答案】
【答案解析】问题1: (1) 18 (2) 求m和n的最小公倍数 问题2: 9 4 1 4 问题3: 局部数组存放字符串作为函数的返回值是不可取的。应使用 maloc{}动态分配函数来进行分配空间,存储字符串结果,返回其首指针。 [解析] 问题1: 阅读代码,我们可以看出k在的三行取得的是m和n中的最大值,for循环的循环主体为空,可是却要满足“(k%m!=0),||(k%n!= 0)”的条件才能退出循环,即要求k既是m的倍数也是n的倍数,而且k是通过自增得到的,即遇到第一个满足条件的值就立即退出循环返回k值,所以k是m和n的最小公倍数。 调用test_f1(9,6)时,返回9和6的最小公倍数18。 问题2: 9 4 1 4 str是char型数组,sizeof(str)求的是整个数组的长度,数组中总共保存了8个字符和1个结束符'/0',所以长度为9; p是char型的指针,sizeof(p)求的是指针的长度,而不是p所指向的字符串的长度,指针的长度是固定的4个字节; i是char型的字符,系统为每个字符分配一个字节,故长度为1; ptr是类型为空的指针,虽然类型为空但只能说明ptr所指向的对象的类型,ptr自身是一个指针,是有固定长度4的。 问题3: tstr是一个char型数组,但它是在函数test_f3中定义的局部变量,在函数调用结束时内存空间就会被释放掉,返回的指针可能为空,也有可能是乱码,正确的修改方法就是使用malloc函数来动态地申请内存,然后返回这片内存的首指针,这样就会避免函数返回时内存被释放掉。 另外需要注意的是,本大题在一开始就指明是C函数,所以这里不可以使用new来动态申请内存。