阅读以下说明、C函数和问题,将解答写入答题纸的对应栏内。
【说明1】函数test_fl(intm,intn)对整数m、n进行某种运算后返回一个整数值。【C函数1】
【问题1】(1)请写出发生函数调用test_fl(9,6)时,函数的返回值;(2)请说明函数testfl的功能。
【说明2】设在某C系统中为每个字符分配1个字节,为每个指针分配4个字节,sizeof(x)计算为x分配的字节数。函数test_f2()用于测试并输出该C系统为某些数据分配的字节数。【C函数2】
【问题2】请写出函数test_f2()的运行结果。
【说明3】函数test_f3(chars[])的功能是:将给定字符串s中的所有空格字符删除后形成的串保存在字符数组tstr中(串s的内容不变),并返回结果串的首地址。【C函数3】
【问题3】函数test_f3()对返回值的处理有缺陷,请指出该缺陷并说明修改方法。
参考答案:
【问题1】(1) 18(2)求两个整数的最小公倍数考生解答含义与最小公倍数相同即可给分。
【问题2】
【问题3】缺陷:返回了局部数据(或变量,或数组)的指针(或地址)。修改方法:用malloc函数申请存储字符串的存储空间,令指针tstr指向该存储空间并返回tstr的值即可。
解析:
问题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来动态申请内存。