C语言程序里全局变量、局部变量、堆、栈在Ubuntu里的验证
- 全局变量和局部变量
- Ubuntu下验证
- 堆和栈
- Ubuntu下验证
全局变量和局部变量
1、全局变量和局部变量的区别在于变量被作用的范围不一样,全局变量被定义在在整个程序中作用于全部过程,而局部变量大多数定义于某个函数当中,只作用于这个函数里,脱离了这范围就不再生效。
2、内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
Ubuntu下验证
1、验证程序
#include <stdio.h>
int n = 10; //全局 变量
void func1(){
int n = 20; //局部变量printf("func1 n: %d\n", n);
}
void func2(int n){
printf("func2 n: %d\n", n);
}
void func3(){
printf("func3 n: %d\n", n);
}
int main(){
int n = 30; //局部变量func1();func2(n);func3();//代码块由{}包围{
int n = 40; //局部变量printf("block n: %d\n", n);}printf("main n: %d\n", n);return 0;
}
2、验证结果
分析: 由此可以清晰看出两种变量的作用域。
1、对于 func1(),输出结果为 20,显然使用的是函数内部的 n,而不是外部的 n;func2() 也是相同的情况。当全局变量和局部变量同名时,在局部范围内局部变量具有优先性。
2、func3() 输出 10,使用的是全局变量,因为在 func3() 函数中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。
堆和栈
1、栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2、堆区(heap) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。程序结束后由系统释放。
Ubuntu下验证
1、验证程序
#include <stdio.h>
#include <malloc.h>
int main(void)
{
/*在栈上分配*/int i1=0;int i2=0;int i3=0;int i4=0;printf("栈:向下\n");printf("i1=0x%08x\n",&i1);printf("i2=0x%08x\n",&i2);printf("i3=0x%08x\n",&i3);printf("i4=0x%08x\n\n",&i4);printf("--------------------\n\n");/*在堆上分配*/char *p1 = (char *)malloc(4);char *p2 = (char *)malloc(4);char *p3 = (char *)malloc(4);char *p4 = (char *)malloc(4);printf("p1=0x%08x\n",p1);printf("p2=0x%08x\n",p2);printf("p3=0x%08x\n",p3);printf("p4=0x%08x\n",p4);printf("堆:向上\n\n");/*释放堆内存*/free(p1);p1=NULL;free(p2);p2=NULL;free(p3);p3=NULL;free(p4);p4=NULL;return 0;
}
2、验证结果
分析:可以发现内存中的栈区主要用于分配局部变量空间,处于相对较高的地址,其栈地址是向下增长的;而堆区则主要用于分配程序员申请的内存空间,堆地址是向上增长的。