最近看了一些关于C语言中变量存储机制的资料,觉得还有有一些东西不太理解,自已想做一个整理,这是第一次在在CSDN上发表这样的带点原创的技术的文章。
按照GNU lib C的说法,C语言程序支持两种变量存储分配方式,一种是静态分配方式。静态分配主要支持静态变量和全局变量,自打程序开始运行,它们不会被释放,这个过程由编译器完成。
还有一种方式是自动分配,它支持自行变量,如函数体的参数和局部变量,当函数执行完,它们释放掉存储空间。
我想大家应该知道还有一种技术叫做动态分配,在运行时才知道在哪存放什么信息的一种技术,它可以很灵活的在堆中分配空间,这个过程由malloc函数完成。
先来看一段程序:
char *get()
{
char a[]="hello,world";
char *p;
p=a;
return p;
}
int main()
{
char *d=NULL;
d=get();
printf("%s\n",d);
return 0;
}
调用此函数时,并不能得预期的"hello,world";
char *get2()
{
char *a="hello,world";
return a;
}
而这样就可以了,这是为什么呢?
就这涉及到变量的存储问题了,在get()中,a为函数内部的字符数组,为自动变量,它存储在系统为它开辟的一段栈上,当调用get()结束后,系统收回了它的存储空间,其值不存在了,既然不存在了,那么p也就指向了一个未知区域了。
再来看get2()函数,它利用指针来赋值,a指针本来为一个整形的变量,它有值,就是常量“hello,world"的地址了,a的值存储在栈上,而常量"hello,world"则存储在常量区,(至于为什么的要这样存储,我还没有找到根据)这样即使函数调用结束,也只是销毁了a的值,常量还是存在的。所以程序能够正确执行。
这里还要说明一点,函数是有功能,它也是有值,也即,它也是一个变量,只不过它是有着内部处理功能的变量,在上例程序中,返回值为char *类型的get()函数显然是一个全局变量,这样理解也便于把全局变量,局部变量的概念统一化。
再来看一个程序就明白了:
char ok()
{
char p='a';
return p;
}
int main()
{
char d=ok();
printf("%s\n",d);
return 0;
}
分析ok()函数,里面的p是局部变量,在main中调用完之后其值会自动销毁,但是由于return的作用,p的值赋给了这个函数,ok()是全局变量,直到程序结束才销毁其值。关于静态变量:
int fun(int n)
{
static int p=1;
p=p*n;
return p;
}
int main()
{
int i;
for(i=1;i<5;i++)
printf("%d!=%d\n",i,fun(i));
return 0;
}
结果是这样的:
1!=1
2!=2
3!=6
4!=24
或许你很奇怪每次调用fun函数时都有static int p=1;会把它以前的值覆盖啊,这就是静态变量的好处,静态变量只初始化一次,(至于为什么这样,一直没查到原因,我很期待有人能回答这个问题)它的值与全局变量一起保存在静态存储区,所以其实fun函数每次调用只是在做一句p=p*n;
第一次发技术文章,多有不足之处,诚恳接受各位访客的指教,谢谢。