这是我的第一次在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。局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。