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

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

猜你喜欢

转载自blog.csdn.net/rude_dragon/article/details/110527927