大家先来看下下面程序的区别:
int add(int a,int b)
{
int c = 0;
c = a + b;
return c;
}
char *dest(char a ,char b)
{
(static)char dd[10];
dd[0] = a;
dd[1] = b;
return dd;
}
int main()
{
printf("%d\n",add(2,3)); //正确的
printf("%s\n",dest(2,3)); //错误的,可以通过开辟静态数据空间来实现这种方式,红字表示
return 0;
}
那么我们来想一下,这是为什么呢?c和dd[10]都是局部变量,为什么一个可以操作,一个不可以操作呢?
首先我们来讲一下函数返回时的内存状况,大家都知道局部变量在当前的功能函数执行完后就释放自身开辟的内存空间,那么为什么printf("%d\n",add(2,3));中的add(2,3)的返回值c没有释放,而是在主函数中打印出来了?
实际情况是这样的:
首先,局部变量在函数执行完后要释放,这是没错的,所以c其实在函数执行完后就释放了,那么printf("%d\n",add(2,3));中的值哪来的呢?实际上在执行该函数时,编译器开辟了一个4字节的内存空间(因为打印的是"%d"),然后把add(2,3)返回的值保存到该内存空间,然后释放掉c,相当于在主函数中定义一个变量a,使a = add(2,3),最后打印a的值,所以printf("%d\n",add(2,3));是正确的。
同理,printf("%s\n",dest(2,3));也开辟了一个内存空间来存放dest(2,3)放回的地址,然后释放子函数中所有局部变量的内存空间,如此我们可以看出printf("%s\n",dest(2,3));其实只得到一个地址值而已,内容已经释放,随机、不确定,打印出来是混乱的数据。变成静态变量后,在程序执行的整个过程中都不会释放,所以能够打印出来正确的值。但静态空间也是有限的,所以使用时要注意,不要超出范围。