将字符串s1中任何与字符串s2匹配的字符都删掉

     源自《The C Programming Language》P38 pr2-4:

 

     编写函数squeeze(s1, s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。

 

     代码:

    

     分析:

 

     1,  关于函数返回值,如果本例中将字符串s定义在函数squeeze中,当执行完return s;后,将会给主函数返回一个char*

          指针,但因为s是squeeze的局部变量,当调用完squeeze后会释放字符串s所占有的空间,故在主函数中打印字符串

          printf("%s/n", squeeze(str, charset));时,只是打印了存放在主函数临时变量中的从squeeze中返回的指针所指向

          的字符串,而这个字符串是个未知字符串,所有会在终端打印出莫名其妙的字符串。

 

     2,  关于函数返回值的解析:例如函数fun1调用了函数fun2,当fun2返回时,会将返回值暂存在寄存器中(一般是eax),

          当程序返回到fun1中执行时,fun1会将返回值从eax中拷贝到自己的栈空间中(一般以临时变量的形式),故而在fun1

          中可以使用fun2的返回值。

          Q: 返回值是怎么会被保存到寄存器里呢?

          A:你用return x语句,编译器会给你自动插入
               mov eax, x
               ret
               的代码,汇编指令ret在这里只有返回调用地址的作用,返回值x存储在eax中。

 

     3,  如果将s定义在main函数中,则在squeeze函数中使用s是非法的,未定义的,使用本例中将s定义为全局变量,这样

          不管是对main还是squeeze函数都是可见,已定义的。

 

 

 

    

阅读更多

没有更多推荐了,返回首页