美文网首页
内存四区模型

内存四区模型

作者: 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;
}

相关文章

  • 内存四区模型

    操作系统把C代码分成四个区: (1)堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,...

  • 内存四区模型

    内存四区分为:栈区、堆区、全局区、代码区 c/c++可以在临时区分配内存,用完后自动被编译器清理 函数1调用函数2...

  • 内存四区模型

    全局区 全局区分为:全局变量,静态变量,文字常量区 栈区 堆区 静态局部变量 栈的生长方向

  • 音视频开发之旅(20) 指针、内存模型、引用

    目录 指针 内存模型和四区使用 引用 资料 收获 一、指针 1.1 什么是指针? 指针本质上是地址,用于指向具体的...

  • NDK_03 C/C++的内存四区模型

    导语:内存四区模型是非常重要的一个知识,只有学会从编译器的角度去了解内存是如何分配的,在遇到问题的时候,才能更好的...

  • 内存四区

    stack(栈区):存放局部变量、函数参数、返回数据和返回地址,系统自动分配释放。栈顶从高地址向低地址的方向生长,...

  • Flink JobManager | TaskManager内存

    Flink内存模型分析 JobManager内存模型 TaskManager内存模型 内存模型分析 Flink使用...

  • 图解jvm--(四)内存模型

    内存模型 java 内存模型 很多人将【java 内存结构】与【java 内存模型】傻傻分不清,【java 内存模...

  • JVM内存模型(jvm 入门篇)

    概述 jvm 入门篇,想要学习jvm,必须先得了解JVM内存模型,JVM内存模型,JVM内存模型,JVM内存模型,...

  • java内存模型

    1.内存模型(JMM) 1.1什么是Java内存模型? Java内存模型将内存分为主内存和工作内存两大部分;主内存...

网友评论

      本文标题:内存四区模型

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