内存四区模型

2022-10-03  本文已影响0人  arkliu

全局区

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

#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;
}
上一篇下一篇

猜你喜欢

热点阅读