内存四区-常量区

用代码例子看一个数据区中常量区

#include <stdio.h>
#include <stdlib.h>

char *getStr1()
{
  char *pstr1 = "adfag";//pstr1是局部变量,在声明时入栈,函数结束后出栈 
  return pstr1;
}

char *getStr2()
{
  //因为 getStr1和getStr2二个函数中的字符串一样,C++编译器会对代码做优化,在数据区的常量区只保留一份字符串,即 pstr1和pstr2指向同一个内存地址 
  char *pstr2 = "adfag"; 
  return pstr2;
}

int main()
{
  char *p1 = NULL;
  char *p2 = NULL;
  p1 = getStr1();
  p2 = getStr2();

  printf("p1:%s, p2:%s \n", p1, p2);//打印指针p1,p2所指向内存空间的数据 
  printf("p1:%d, p2:%d \n", p1, p2);//打印指针p1,p2的值 
  system("pause");
  return 0;
}

运行结果如下:

可见,二个相同的字符串的情况,在常量区不会开辟二块内存,而是使用相同内存区域,相当于一个字符串。

PS: 因为常量区内存空间的生命周期归操作系统管理,函数getStr1,getStr2执行完后不会被析构掉,所以我们可以在调用函数里使用该字符串常量。

原文地址:https://www.cnblogs.com/fengxing999/p/10222640.html

时间: 2024-10-10 20:15:56

内存四区-常量区的相关文章

C语言的内存管理分析 栈区 代码区 堆区 静态区 常量区

系统为了管理内存 把内存划分了几个区域 1> 栈区 栈区之中的数据在栈区之中以栈的形式进行存储. 栈区的特点:数据是先进后出, 放在栈区里面存放的是局部变量.(例如定义在函数内部的变量) 栈区之中的数据(局部变量)的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理 2> 堆区 高效的使用内存 这里的内存可以由程序员自己手动管理 高效的使用内存  例如: 申请内存 释放内存.优化内存 ARC 申请内存的函数 malloc()  memary a

C++中栈区 堆区 常量区

原文地址:http://blog.csdn.net/xcyuzhen/article/details/4543264 C++中栈区 堆区 常量区(由一道面试题目而学习) 2009-04-28 21:01 #include<iostream.h> void main() { char a[]="abc";栈 char b[]="abc";栈 char* c="abc";abc在常量区,c在栈上. char* d="abc&qu

【转载】程序中的堆 栈 可读写数据区 常量区 代码区

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

c语言内存四区模型

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

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

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

11 常量区的内容不能被修改

下面叙述错误的是() char acX[]="abc";          char acY[]={'a','b','c'};          char *szX="abc";          char *szY="abc"; A.acX与acY的内容可以修改 B.szX与szY指向同一个地方 C.acX占用的内存空间比acY占用的大小 D.szX的内容修改后,szY的内容也会被更改 分析: 答案是D.acX , acY 是2个数组,属于变量

深入理解数据类型、变量类型属性、内存四区和指针

数据类型可理解为创建变量的模具(模子):是固定内存大小的别名. 数据类型的作用:编译器预算对象(变量)分配的内存空间大小. 既能读又能写的内存对象,称为变量:若一旦初始化后不能修改的对象则称为常量. 变量本质:(一段连续)内存空间的别名. 内存四区 栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等. 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收. 全局区(静态区)(static):全局变量和静态变

【C语言】程序内存四区

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

面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期

1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联性. 在C++中,通过抽象数据类型(abstract data type, ADT),在类中定义数据和函数,来实现数据和函数直接的绑定. C++成员数据:static.nonstatic C++成员函数:static.nonstatic.virtual C++中的类class从面向对象理论出发,将变