C++ 不可重入函数之static变量

之前写过一篇文章:localtime的多线程问题_原十的博客-CSDN博客_localtime 多线程工作中遇到的问题:设备需要上传图片到云平台,在上传失败时会进行重传,但在重传时却找不到对应的文件(文件命令方式为:日期_时间_id.jpg,如:2021-04-19_09_48_33_123456.jgp,文件名中的id是唯一的)。文件名中的日期-时间是从数据库里取出,然后再组成文件名字符串,再取文件进行上传。问题就是:id跟上传失败的文件id一样,但日期时间却不一样,本应该取上传失败的文件进行重传,结果文件名不一样导致找不到文件。原因:在从数据库中取得文件信息后,信息里有文件的时间戳,当用localthttps://blog.csdn.net/tianyexing2008/article/details/115857693?spm=1001.2014.3001.5502

今天来看下面这个例子:以下都是cpp代码

#include <stdio.h>
#include <stdlib.h>

int *func(int x);

int main()
{
    int *p1 = func(10);
    int *p2 = func(20);
    printf("p1 addr = %p, value = %d\n", p1, *p1);
    printf("p2 addr = %p, value = %d\n", p2, *p2);
    
    return 0;
}

int *func(int x)
{
    //c语言中如果要初始化则必须为常量
    static int value = x;
    return &value;
}

 结果输出是什么呢?

返回的地址是一样的,因为是static变量,存放在bss段,是同一个变量,所以地址是一样的。

那为什么value的值都是10呢?这里涉及到static变量初始化的问题,我们知道static变量的生命周期跟程序一样长,其只会初始化一次(网上搜索相关的也是这样描述)。我们实际用gdb跟踪查看:

单步调试进入函数查看,第二次调用func(20)时,value还是10,即static int value = x 这句 初始化只会执行一次,所以两次调用结果都是10。

那如果改成如下代码呢?

#include <stdio.h>
#include <stdlib.h>

int *func(int x);

int main()
{
    int *p1 = func(10);
    int *p2 = func(20);
    printf("p1 addr = %p, value = %d\n", p1, *p1);
    printf("p2 addr = %p, value = %d\n", p2, *p2);
    
    return 0;
}

int *func(int x)
{
    //c语言中如果要初始化则必须为常量
    static int value;
    value = x;
    return &value;
}

结果又是什么呢?

 结果是最后一次调用的值,这个很好理解,因为两次调用value都是同一个地址,后一次调用的值覆盖了前一次调用的值。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值