源自《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函数都是可见,已定义的。