今天来看下面这个例子:以下都是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都是同一个地址,后一次调用的值覆盖了前一次调用的值。