+ -
当前位置:首页 → 问答吧 → 关于static局部变量返回

关于static局部变量返回

时间:2010-08-30

来源:互联网

static局部变量生命周期是从定义到程序退出,所以
  1. char *f()
  2. {
  3.   static char *str="hello";
  4.   return str;
  5. }
复制代码
是没有问题的,可是static变量的可见范围只是函数内部,感觉这样写有点别扭,库函数里也有一些是这种情况,不知道它是用全局变量实现还是static还是它内部malloc了要自己free掉。

作者: kingoftime3   发布时间: 2010-08-30

具体哪个函数。看下源代码。

那天看了一下inet_ntoa 用的是全局变量。

作者: zhangsuozhu   发布时间: 2010-08-30

C语言标准库中的很多函数,如ctime,strtok,tmpnam等等都是利用静态区实现的。多线程环境下使用这些函数的是有一定要注意。

作者: davelv   发布时间: 2010-08-30

@kingoftime3

你完全混淆了问题。

>> 03    static char *str="hello";

这一行无论是否用 static 修饰,实际效果都是一样的。

作者: langue   发布时间: 2010-08-30

rodata区

作者: zhangsuozhu   发布时间: 2010-08-30

"hello"被丢入.rodata,所以加不加貌似都一样

作者: daybreakcx   发布时间: 2010-08-30

但是加上static就没警告,不加就会有

作者: kingoftime3   发布时间: 2010-08-30



QUOTE:
@kingoftime3

你完全混淆了问题。

>> 03    static char *str="hello";

这一行无论是否用 static  ...
langue 发表于 2010-08-30 12:03


正确,其实可以认为没有区别.你可以认为返回的是地址,而不要认为是一个指针变量.

作者: ilwmin   发布时间: 2010-08-30

static 对变量的生命周期没有影响,它影响的是变量存放的位置。

巧的是,无论是否有static,作为内容hello都是存放在常量区的。char *str,改成char str[] = "hello" 就有区别了,
在没有static时,hello放在栈上,加上static,hello放在静态数据区。返回栈上的指针,无意义,返回静态数据区指针才有意义。

作者: zzyong08   发布时间: 2010-08-30