C语言的变量存储分配

来源:互联网 发布:美国哥特式知乎 编辑:程序博客网 时间:2024/05/19 13:14

      最近看了一些关于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;

第一次发技术文章,多有不足之处,诚恳接受各位访客的指教,谢谢微笑




原创粉丝点击