1.生存周期问题
#include <stdio.h>
#include<string.h>
char * mystring()
{
char str[20];
strcpy(str,"hello");
return str;
}
int main(int argc, char const *argv[])
{
printf("%s\n",mystring());
return 0;
}
- 上面代码执行出现的问题是,str作为局部变量,出了函数(作用域{ })就会被销毁,此时mystring返回值为一个野指针;
- 解决方法是想办法提高str变量的生存周期;
- 可以通过static提高其生命周期,或者malloc申请堆空间来解决;
- 注意static +局部变量只是让它的生命周期持续到程序运行结束,其作用域仍然是mystring函数,故有static变量的作用域<=生命周期;
2.正确代码如下
- 方法1
char * mystring()
{
static char str[20];
strcpy(str,"hello");
return str;
}
- 方法2
char * mystring2()
{
char *str=(char *)malloc(sizeof(char)*20);
strcpy(str,"hello");
return str;
}
int main(int argc, char const *argv[])
{
char *ret=mystring2();
printf("%s\n",ret);
free(ret);
return 0;
}
3.static的作用
- 在函数体内,一个被声明为静态的局部变量,在这一函数被调用的过程中维持其值不变;
- 在模块内(但是在函数体外),一个被声明为静态的全局变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问,是一个本地化的全局变量,其他文件不能通过extern使用该全局变量;
- 在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用,这个函数被限制在声明它的模块的本地范围内使用,故不同文件可以使用相同名字的静态函数;
4.static全局变量和普通全局变量的区别
主要作用是限制其作用域,static全局变量只初始化一次,防止在其他文件单元中被引用。
详解:
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
5.static局部变量和普通局部变量的区别
主要作用是提高其生命周期,而改变不了其作用域,static局部变量只被初始化一次,下一次依据上一次的结果值。
详解:
void static_test()
{
int m=3;
static int n=5;
}
局部变量m存放在栈中,当test函数结束,m将被销毁;静态变量n不存放在栈中,而是存放于程序的全局变量区域,因此随着函数test的结束,它并不随着出栈操作而被销毁,它的生存周期存在于程序的整个运行期;然而m和n的作用域都仅存在于test函数中它们的定义之后,即test调用结束之后,m和i就不再可用,但是i仍存在于内存之中。
6.static函数和普通函数的区别
主要目的是限制其作用域,static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。