试题三:阅读以下说明和C代码,回答问题1和问题2,将解答写在答题纸的对应栏内。
【说明】下面是用C语言书写的函数get_str的两种定义方式以及两种调用方式。
若分别采用函数定义方式1、2和调用方式1、2,请分析程序的运行情况,填充下面的空(1)~(3)。 若采用定义方式1和调用方式1,则输出为“00000000”。 若采用定义方式1和调用方式2,则(1)。 若采用定义方式2和调用方式1,则(2)。 若采用定义方式2和调用方式2,则(3)。
参考答案:
(1)输出为“00000000”
(2)运行异常,无输出 或含义相同的叙述
(3)输出为“testing”
解析:
关于函数get_str的两种定义方式,其区别在形式参数的类型不同,从而导致调用时对实参的要求不同。对于定义方式1,其函数首部为:void get_str(char*p),参数p是指针参数,因此,调用该函数时的实参应为指针,可以是字符数组名、字符变量的地址或指针变量。在调用方式1中, 正是以指针变量ptr为实参,此时,采用的参数传递方式为传值,因此,回到调用函数后,ptr的值并没有变(仍然为NULL),因此,输出 为"00000000"。而在调用方式2中,是以指针变量ptr的地址为实参进行调用,开始执行函数get_str时,指针p指向的目标为变量ptr,但 是调用了malloc函数后,重新为p赋值了,即p指向了其他存储区(串拷贝函数运行后,p所指区域的内容为字符串"testing"),p-开始指向的 目标变量ptr的内容没有变。由于是传值调用,所以回到mam函数后,ptr变量的值并没有改变,因此,输出仍为"00000000"。 对于定义方式2,其函数首部为:void get_str(char**p),参数p是指向指针的指针参数,要求调用该函数时的实参为指针的地址,因此,对于调用方式1,以指针变量ptr为实参, 与形参的要求不匹配,会导致运行异常,不能产生输出。而在调用方式2中,是以指针变量ptr的地址为实参进行调用,符合要求,因此在函数get_str 中,*p即表示目标变量ptr,通过malloc申请到的存储区域首地址复制给*p,也就是令ptr指向了申请到的存储区域起始位置,串拷贝函数运行后, 将字符串"testing"放入该存储区,最后回到调用函数mam后,ptr指向的目标改变了,因此输出为"testing"。