C语言day05_变量

C语言变量

一、全局变量

  • 定义在函数外面的变量
  • 全局变量具有全局的生存期和作用域
    • 它们与任何函数都无关
    • 在任何函数内部都可以使用它们

实例:

#include <stdio.h>

int globalVar = 12;

int fun(void);

int fun(void){
    printf("in %s globalVar = %d\n",__func__, globalVar);
    globalVar += 2;
    printf("agn in %s globalVar = %d\n",__func__, globalVar);

}

int main(int argc, char const *argv[])
{
    printf("in %s globalVar = %d\n",__func__, globalVar);
    fun();
    printf("agn in %s globalVar = %d\n",__func__, globalVar);
    return 0;
}

输出:

in main globalVar = 12
in fun globalVar = 12
agn in fun globalVar = 14
agn in main globalVar = 14

1.1 全局变量初始化

  • 没有zuo初始化的全局变量会得到0值
    • 指针会得到NULL值
  • 只能用编译时刻已知的值来初始化全局变量
  • 它们的初始化发生在main函数之前

1.2 全局变量被隐藏

  • 如果函数内部在与全局变量同名的变量,则全局变量被隐藏

二、静态本地变量

  • 在本地变量定义时加上static修饰符就成为静态本地变量
  • 当函数离开的时候,静态本地变量会继续存在并保持
  • 静态本地变量的初始化只会在第一次进入函数时做,以后进入函数时会保持上次离开时的值

实例:

int fun(void);

int fun(void){
    static int all = 1;
    printf("in %s all = %d\n",__func__, all);
    all += 2;
    printf("agn in %s all = %d\n",__func__, all);
    return all;
}

int main(int argc, char const *argv[])
{
    fun();
    fun();
    fun();
    return 0;
}

2.1 静态本地变量

  • 静态本地变量实际上是特殊的全局变量
  • 它们位于相同的内存区域
  • 静态本地变量具有全局的生存期,函数内的局部变量作用域
  • static在这里的意思是局部作用域(本地可访问)

实例:

int globalVar = 12;

int fun(void);

int fun(void){
    int localVar = 0;
    static int staticVar = 1;
    printf("&globalVar = %p\n", &globalVar);
    printf("&staticVar = %p\n", &staticVar);	//静态变量的地址是和
    printf(" &localVar = %p\n", &localVar);

    printf("in %s all = %d\n",__func__, staticVar);
    staticVar += 2;
    printf("agn in %s all = %d\n",__func__, staticVar);
    return staticVar;
}

int main(int argc, char const *argv[])
{
    fun();
    return 0;
}

输出:

&globalVar = 0000000000403010
&staticVar = 0000000000403014		//静态变量的地址是和全局变量放在一起的。
&localVar = 000000000061FDEC
in fun all = 1
agn in fun all = 3

三、返回指针变量

  • 返回本地变量的地址是危险的
  • 返回全局变量或静态本地变量的地址是安全的
  • 返回在函数内malloc的内存是安全的,但是容易造成问题
  • 最好的做法是返回传入的指针

3.1 返回本地变量的地址是危险的

#include <stdio.h>

int* f(void);
void g(void);

int* f(void){
   int i = 12;
   return &i;
}

void g(void){
    int k = 24;
    printf("k = %d\n", k);
}

int main(int argc, char const *argv[])
{
    int *p = f();
    printf("*p = %d\n", *p);
    g();
    printf("*p = %d\n", *p);
    return 0;
}

输出:

*p = 12
k = 24
*p = -858993460

image

3.2 注意

  • 不要使用全局变量来在函数传递参数和结果
  • 尽量避免使用全局变量
  • 使用全局变量和静态本地变量的函数是线程不安全的
posted @ 2022-08-11 10:21  DingJie1024  阅读(38)  评论(0编辑  收藏  举报