当前位置: 代码迷 >> 综合 >> C语言程序里全局变量、局部变量、堆、栈在Ubuntu里的验证
  详细解决方案

C语言程序里全局变量、局部变量、堆、栈在Ubuntu里的验证

热度:23   发布时间:2023-12-22 07:03:53.0

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、验证结果
在这里插入图片描述
分析:可以发现内存中的栈区主要用于分配局部变量空间,处于相对较高的地址,其栈地址是向下增长的;而堆区则主要用于分配程序员申请的内存空间,堆地址是向上增长的。