char* fun(const char* src)
{
static char dest[32] = "";
strcpy(dest, src);
return dest;
}
int main(int argc, char* argv[])
{
char s1[32] = "";
char s2[32] = "";
strcpy(s1, fun("hello"));
strcpy(s2, fun("world"));
printf("%s %s\n", s1, s2);
printf("%s %s\n", fun("hello"), fun("world"));
getchar();
}
上文在vs2008的执行结果如下
hello world
hello hello
从以上结果可以看出
1.printf函数从右执行
2.返回static变量的指针有点危险。值则不会有这个问题。
上面的这段代码确实不能看,字符串复制,不需要传入长度参数,也不根据结束符判断大小,也无法确定是否会溢出。不可取,不可取。
我们在写C/C++程序的时候,经常需要从调用函数中取得自己想要的数据,这就需要调用者和函数之间要有个内存的交互,我们通常采用的方法是传递一个指针给被调函数,作为被调函数的输出参数,这也是我们常用的、规范的做法。
但有很多程序员比较习惯直接取返回值,这就面临一个问题就是普通局部变量都是在栈上分派的,会随着函数的结束而弹栈释放,那么就会出现返回局部变量数组的问题,这时有人会想到用malloc或new在堆上分派内存,没错,这样是避免了前面说的问题,但这样又会带来新的问题,就是需要在外部对这块内存进行释放,这个是比较难把握的,多次释放会出现程序的crash,忘记释放了会出现内存leak,所以这种方法也不被推荐。还有人想到了更另类的方法,就是上面例子中的static类型,没错,static变量也是全局的,但就会出现上面程序的运行结果(可以认为不是我们想要的结果,也就是错误的结果)。