记录自已的学习之关键字static

这是我的第一次在CSDN发博,本人的编排可能会有点难看,但请各位看完过后能给点意见,以便于我在以后的博文写得更好。
当然这个博文是我自已对C语言的看法和理解,如果有说错的地方还希望各位能够指出错误的地方,给出自已的修改意见。

首先就是想把C语言的内存分配分成文本区(.text段),数据区(.data段),还有.bss段(.bzero),堆栈区。

其中有static定义的变量一般都是存在于数据区(.data段),这个也叫静态存储区,一般初始化的全局变量和静态变量都会放在这里。


曾经看过有一道程序就是这样的:

#include <stdio.h>

int func(void);

int main(void)
{

int sum = 0;

sum = func() - func() * func();

printf("sum = %d\n", sum);

return 0;
}

int func(void)
{
static int p = 1;

return ++p;
}

你们觉得答案应该是什么?我曾经一度认为答案应该是-2,因为函数在里面一直重复的赋值给p,然后p一直是等于2的出来,结果为-2。
经过查阅的许多资料才懂得原来在函数体内由static声明的变量只在第一次赋值有用,则在以后的程序初始化中不再进行初始化操作
static声明的变量是由程序执行的时候一直存在的,而且还是上次操作执行后的值,看到这里你们也应该知道答案应该不是-2了吧,
答案应该是-10,由于第一次return的时候返回的是2,第二次返回保留了上次的2,执行++操作之后就变成了3,之后保存了3,再一次
执行++操作变成了4,2-3*4=-10。局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值