内存四区中全局区见解

  今天我把自己对于内存四区中全局区见解写出来,希望可以帮到大家,同时也希望指出我的不正!

  可能有些人不解,我不是想通过,内存四区引入指针么?怎么上来就用指针?

  这一点我要说明一下,我用指针是为了更清楚的表明我对于内存四区的见解,是想让大家明白,内存四区是什么?栈区,堆区和全局区之间的关系!

  正如同在栈区和在堆区分配的内存空间是不同的!指针里存的是地址,地址是哪里的地址?是内存上的地址!而如果我们分不清我们的指针到底指向的是哪一个区域的地址,调用起来岂不是很麻烦。比如我们在子函数上分配了一个变量(栈区),我们将指针指向这个变量,在主函数中读取出来的则是一段乱码!但是我们今天先不说这个,先谈一下全局区。

  全局区

  例如在主函数中定义的变量可在子函数中调用(可称为全局变量),但子函数中定义的变量不可以在主函数中调用,除非是子函数将内存地址指向全局区可在主函数中调用;

  我们先看一个例子:

  

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h> 

  char *distribution(in c)
{
  char *a = NULL;
  char b[] = "abcd";//在栈区分配的内存空间

  char d[] = "abcd‘;//在栈区分配的内存空间

  a = b;

  printf("&b:%d,&c:%d\n",&b,&c);//地址不同

  printf("%d\n",c);//成功打印 10
  return a;

}
  int main()
{
  char *a = NULL;

  int b = 10;//栈区分配 可称为全局变量
  a = distribution(b);//用a接受返回的地址

  printf("%s\n",a);//打印字符串,是一堆乱码

  system("pause");
  return 0;
}

  我们发现在 主函数中 栈区上分配的变量 可以 在子函数中调用,而子函数中 栈区上 分配的字符串却无法在主函数上调用

  我们再看第二个例子:

  

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

  int a1 = 10;//全局变量

  static int a2 = 20;//静态全局变量

  

  char*distribution();

  int main()

{

  char*a = NULL ;

  char*b ="abcd";//我们将*b指向一个字符串,而"abcd"分布在全局区

  a = distribution();//用a接受传回来的地址;

  printf("%s\n",a);//字符串成功打印出来

  printf("a = %d,b = %d\n",a,b);//因为指针是指向地址,所以打印出来的是地址;当加上 * 时,则是向地址里取出值;

  //打印之后我们发现两个地址是一样的

  return 0;  

}

char*distribution()

{

  char*c = "abcd";//这里我们将c也指向一个"abcd",同样“abcd”也是全局变量

  return c;//这里返回的是指针指向的地址

}

  通过以上两个例子我们可以发现:同样是在子函数中,栈区所分配的内存空间无法传递到主函数中,而全局区的却可以;

  在栈区中分配相同字符串时,打印出来的两个地址不同。而且当我们将指针指向全局区同样的字符串时,打印出的地址却一样;

  那么可以这样认为,在栈区上分配的内存空间在主函数上不会自动析构(程序未运行完之前),而在子函数中会被析构掉(子函数运行完之后),

  在全局区上时, 只要分配了空间,就不会被自动析构掉,而且为了节省内存资源,当我们多次调用它时,它不会再次分配内存空间。

时间: 2024-10-18 11:30:48

内存四区中全局区见解的相关文章

转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.- 程序结束释放4.另外还有一个专门放常量的地方.- 程序结束释放                          

内存管理:栈区,堆区,全局区,文字常量区,程序代码区

一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变

c语言—栈区,堆区,全局区,文字常量区,程序代码区 详解

转:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)-,全局

内存四区中堆区见解

堆区 由程序员分配释放 若程序员不释放,则在程序结束后自动释放. 堆区就像定义一样,由程序员自己分配,这里我们使用malloc函数来分配空间: #include <stdio.h> #include <string.h> #include <stdlib.h> char *getMem(int num) { char *p = NULL; p = (char *)malloc(sizeof(char) * num);//在堆区分配一块内存,并将指针指向这块区域 if(p

C#中的内存四区

由于C#是一种托管语言,它的垃圾回收机制(GC)是由.net平台负责的,加之C#语言并没有指针,所以我们在使用过程中极少会考虑到内存使用状况以及项目在运行过程中是如何进行内存管理的.但是,C#只是在内存管理方面对程序员隐藏了,并不代表它不涉及这些东西,甚至其内部内存管理或许比自己手动管理更加复杂.笔者从内存四区(栈区.堆区.全局区.代码区)的角度对C#语言中常见的几种情况分析其内存,但是只是从现象上根据C/C++类似的状况进行推断理解,其底层无法得知,而且针对内存分区也有不同的观点,所以纯属个人

【C语言】程序内存四区

1.栈区(临时区)(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等: 2.堆区(heap) 一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能有操作系统回收: 3.全局区(静态区)(static) 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放: 常量区——字符串常量和其他常量的存储位置,程序结束后由操作系统释放: 4.程序代码区

科普文:C++内存四区详细介绍

C++内存四区是哪四区?C++内存四区分为代码区.全局区.栈区.堆区,下面我们分别介绍详细介绍. 1.代码区 存放 CPU 执行的机器指令.通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可.代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令.另外,代码区还规划了局部变量的相关信息.推荐了解传智播客C++工程师培训课程. 总结:你所写的所有代码都会放入到代码区中,代码区的特点是共享和只读. 2.全局区 全局区中主

c语言内存四区模型

c语言内存四区模型:代码区,全局区(常量区),栈区,堆区 在全局区(常量区),两个字符串完全一样c++编译器只会定义一份 char * getBuf() { char buf[20]; strcpy(buf, "abcde"); return buf; } abcdX?  有乱码! 确实把内存地址返回了,但不能用 被调函数调用完毕,在临时区分配的内存统统消失 char *buf= (char *)malloc(sizeof(char)*20); 手动malloc申请一份内存,由程序员手

内存四区-常量区

用代码例子看一个数据区中常量区: #include <stdio.h>#include <stdlib.h> char *getStr1(){ char *pstr1 = "adfag";//pstr1是局部变量,在声明时入栈,函数结束后出栈  return pstr1;} char *getStr2(){ //因为 getStr1和getStr2二个函数中的字符串一样,C++编译器会对代码做优化,在数据区的常量区只保留一份字符串,即 pstr1和pstr2指向