美文网首页
内存四区模型

内存四区模型

作者: arkliu | 来源:发表于2022-10-03 08:32 被阅读0次

    全局区

    全局区分为:全局变量,静态变量,文字常量区

    #include <stdio.h>
    
    char * getstr() {
        char * p = "hello world"; //文字常量区
        return p;
    }
    
    char * getstr2() {
        char * p = "hello world"; //文字常量区
        return p;
    }
    
    int main() {
       char * p = NULL;
       char * q = NULL;
       p = getstr();
       // %s指针指向内存区域的内容  %d打印指针本身的值
       printf("p = %s, p = %d\n", p , p); // p = hello world, p = 4210688
       q = getstr2();
       // %s指针指向内存区域的内容  %d打印指针本身的值
       printf("q = %s, q = %d\n", q , q); // q = hello world, q = 4210688
    
       /* 上面"hello world"保存在文字常量区, 
       getstr内部的p指针指向"hello world"地址,然后返回该地址给main函数里的p指针,所以此时p指针指向"hello world"的地址
       getstr2内部的q指针指向"hello world"地址,然后返回该地址给main函数里的q指针,所以此时q指针指向"hello world"的地址 */
    }
    
    image.png

    栈区

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char * getstr() {
        char str[] = "abcdef";//栈区
        return str;
    }
    
    int main() {
       char buf[128] = {0};
    
       strcpy(buf, getstr());
       printf("buf = %s\n", buf); //乱码,不确定
       return 0;
    }
    
    image.png

    堆区

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char * getstr2() {
        char * tmp = malloc(128);
        if (tmp == NULL)
        {
            return NULL;
        }
        
        tmp = "abcdef";
        return tmp;
    }
    
    int main() {
       char * p = NULL;
       p = getstr2();
       if (p != NULL)
       {
            printf("p = %s\n", p); 
            free(p);
            p = NULL;
       }
       return 0;
    }
    
    image.png

    静态局部变量

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int * getA(){
        static int a = 10; // a的地址在全局区,getA函数返回a的地址
        return & a;
    }
    
    int main() {
       int * p = getA();
       printf("p = %d\n", *p); 
       return 0;
    }
    

    栈的生长方向

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
       int a = 10;
       int b = 20;
       // 地址递减
       printf("&a = %d &b = %d\n", &a, &b); // &a = 6422044 &b = 6422040
    
       int arr[10];
       printf("arr = %d, arr+1 = %d\n", arr, arr+1); // arr = 6422000, arr+1 = 6422004
       return 0;
    }
    

    相关文章

      网友评论

          本文标题:内存四区模型

          本文链接:https://www.haomeiwen.com/subject/suxsartx.html