问答题
阅读以下说明、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来动态申请内存。