C++中常量在内存中的分布,以及用const_cast修改不同常量的问题 80C

1.
char* p = "abcde";
const char s[10] = “abcde”;
const int x[2] = {1, 2};
const int i = 10;
四者分别放在哪里
// 比如是不是 p指向的"abcde"在文字常量区(.text????) s[10]被放在.rodata中? 那x[2]和i被放在哪里呢
2.
和上一个问题相关
为什么s[2]可以通过const_cast修改值 //x[1] x[0]也可以
用const_cast修改p[2]值程序会崩溃
好像i被载入了编译器的符号表,所以修改i对应的内存,输出i还是不变的?
为什么x[0] x[1] 不被载入符号表呢?
也就是为什么用const_cast修改他们会有不同的表现呢,起码有三种吧,麻烦分别解释下

参考,编译器的符号表:https://blog.csdn.net/heyabo/article/details/8745942
话说运行时为什么还有编译器的事?

3个回答

1、const 加在 操作类型符前面:值的内容不可变; const char* const p = "abcde" ; 指针和指针所指的内容不可
2、const 修饰的常量放在 .rodata
3、const_cast 修改的左值也只能是一般变量,不能是 const 变量, const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。
4、编译分为 预编译和运行时编译,预编译主要是做 文件包含,宏加载等工作; 运行时编译就是代码运行过程中变量动态加载、多肽等操作
个人愚见,欢迎指正

x[0.1.2]值可以改变,只是防止重复定义

const可以修饰普通变量,该变量就会被当做常量来处理,即其值一经初始化就再不能被修改。
常量指针:指向常量的指针。即无法通过该指针修改其目标。
const int *cp int const *cp *cp = 200 //编译错误 cp = &b //可以编译
指针常量:指针型的常量,即无法修改其值的指针。
int * const pc = &b //指针常量 int c = 300; pc = &c //编译错误
const int * const p //常量指针常量,p本身不能改,其目标也不能改。 int 前面的const 是指*p是不可以更改的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
常量与变量以及在内存中存储形式
变量:其值在其作用域内可以改变的量叫做变量。变量在其使用前必须定义,每一个变量都有自己的地址。 变量可以分为整型、浮点型(实数)、字符型、指针型。 每一个变量被定义好了,系统就会分配字节给其来存放值。 整型变量:4个字节(长整型4、短整型2,(无符号型与有符号的字节数一样,只是有符号的最高位为符号位))。 浮点型变量:float4个字节,double8个字节。 字符型变量:1个字节。
常量和变量的存储类型
常量的样子和变量完全一样,只是它们的值不能被修改,可以使用const关键字来声明常量。rnint  const   max_eleemnts = 50;rnmax_eleemnts  是一个值不能被修改的变量rn所以数组的长度不可以使用rn但是此时可以用 #define   MAX_ELEEMNTS  50rn      int  arr[MAX_ELEEMNTS ];就是正确的声明。rn   
C/C++ 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区
这可以帮助你深入了解程序的运行机制,由于自己还是一个初学者,因此大部分内容都只是转载。 http://blog.sina.com.cn/s/blog_7edcf63b0100yhk9.html http://www.cnblogs.com/CBDoctor/archive/2011/12/24/2300624.html   一. 在c中分为这几个存储区 1.栈 ——由编译器自动分配释放
C++11 利用const_cast和type_traits修改类成员常量的通用模板函数
对于const定义的常量,不能直接修改它的值,这是这个限定符最直接的表现。但是某种情况下我们突破const限定修改其内容,C++11中可以使用const_cast转换符是用来移除变量的const限定符。关于const_cast的用法网上可以找到很多很多,基本的原理就是通过指向常量的指针来修改常量的内容,就像下面这样:const int c = 21;n//下面三行代码实现修改常量cnconst in
C语言代码和各种常量、变量在内存中的储存位置及内存优化
全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起; 普通局部变量保存在堆栈中; 全局变量和局部变量在内存里的区别?  一、预备知识—程序的内存分配  一个由c/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区(h
关于const常量的内存分配问题
关于C++中局部变量在栈中分配被无数人提到,本人也查看了别人的很多资料。我对这个问题的研究开始于高质量程序设计指南中关于const常量是否占内存空间的说法,原文为:在C语言中,用const定义的常量其实是值不能修改的变量,因此会给它分配存储空间;但是在C++中,const定义的常量要具体情况具体对待:对于基本数据类型的常量,编译器会把它放到符号表中而不分配存储空间,而ADT/UDT的const对象
字符串常量内存释放问题
#include using namespace std; char *str1() { char *str="hello world"; return str; } char *str2() { char str[]="hello world"; //str[]在栈上,子函数结束后自动释放内存 return str; } char *str3() { static char
[cuda]常量内存
博客分类:       我们在cuda编程中定义变量的时候,可以用__constant__来修饰定义,代表着定义了一个常量内存。向常量内存中拷贝数据的时候不再使用,而改为使用。对于常量内存,不需要在使用完成后用cudafree释放空间。     常量内存带来的性能提升 伦理片 http://www.dotdy.com/     __co
黑马程序员—C语言数据类型及不同类型常量表示方法
一、C语言中的数据类型 1.数据类型的分类 C语言中常用的数据类型从大的方面可以分为5大类,分别是:基本类型、构造类型、指针类型、空类型void和定义类型typedef。而具体到各大分类中又可以划分为一些小的分类,像在基本类型中,有短整型(short),整形(int),长整形(long),字符型(char),单精度实型(float)和双精度实型(double);在构造类型中又可细分出数组类型,
才搞清楚常量的存储位置
 一个形如42的值被称为字面值常量。字面值常量的形式和值决定了常量的类型。例如0x42是16进制表示的整型常量。‘a'是char型字面值。字面值常量顾名思义由字面意思表示,是常量。字面值常量在程序中是直接表示的,整型直接写出大小,字符直接写出字符。一个字面值常量在编译时被直接解析为立即数,编译器内部维护字面值常量的类型。      常量表达式是指在编译过程中,该表达式的值不会改变,且编译过程中可以...
关于字符串常量在内存中的生命周期
字符串char *p="hello" char p[]="hello"
const常量引用的使用方法
C++编程语言中,对于常量的引用是一个非常重要的应用技巧。在这篇文章中,我们将会为大家详细介绍一下有关C++常量引用的相关应用方法,相信大家可以从中学到很多知识。 C++单例模式基础内容详解C++创建Web服务相关方法剖析C++构造函数如何进行初始化C++标识符命名规则相关应用技巧分享C++函数模板基本概念讲述 如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的
C++ const_cast强制去掉常量属性
#include using namespace std; const int* find(int val,const int* t, int n); int main(){ int a[]={2, 4, 6}; int* ptr;//不是const类型 ptr=const_cast(find(4, a, 3));//去掉const类型 if(ptr == 0) cout<<
利用const_cast进行类型转换
利用const_cast进行类型转换
CUDA学习--内存处理之常量内存(4)
1.常量内存常量内存,顾名思义,它是只读内存。这种类型的内存要么是在编译时声明为只读内存,要么是在运行时通过主机端定义为只读内存。常量只是从GPU内存的角度而言。在编译时声明一块常量内存,需要用到const关键字。 常量内存其实只是全局内存的一种虚拟地址形式,并没有特殊保留的常量内存块。常量内存有两个特性,一个是高速缓存,另一个是它支持将单个值广播到线程束中的每个线程。但要注意的是,对于那些数据不
CUDA中的常量内存__constant__
GPU包含数百个数学计算单元,具有强大的处理运算能力,可以强大到计算速率高于输入数据的速率,即充分利用带宽,满负荷向GPU传输数据还不够它计算的。CUDA C除全局内存和共享内存外,还支持常量内存,常量内存用于保存在核函数执行期间不会发生变化的数据,使用常量内存在一些情况下,能有效减少内存带宽,降低GPU运算单元的空闲等待。 使用常量内存提升性能 使用常量内存可以提升运算性能的
C/C++中define定义的常量与const常量
常量是在程序中不能更改的量,在C/C++中有两种方式定义常量,一种是利用define宏定义的方式,一种是C++中新提出来的const型常变量,下面主要讨论它们之间的相关问题; define定义的常量:   define是预处理指令的一种,它用来定义宏,宏只是一个简单的替换,将宏变量所对应的值替换,如下面的代码: #define NUM 2 int main() { printf("%
C语言的内存管理分析 栈区 代码区 堆区 静态区 常量区
系统为了管理内存 把内存划分了几个区域      1> 栈区      栈区之中的数据在栈区之中以栈的形式进行存储.      栈区的特点:数据是先进后出,      放在栈区里面存放的是局部变量.(例如定义在函数内部的变量)      栈区之中的数据(局部变量)的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理
变量,常量,静态变量存储的位置
常见的存储区域可分为: 1、栈 由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 2、堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收。 3、自由存储区 由malloc等分配的内存
iOS 不要用宏来定义你的常量
首先,预处理命令他不是一个常量!!!! 我们来看一段代码 #define avatar @"60" if (false) { #define avatar @"80" } NSLog(avatar); 这段代码会输出多少,我们将“avatar”定义为了60,然后在一个永远不会执行的代码里面重新定义了“avatar”为80,if语句中的代码永远不会执行,但是在编译时期,编译器会编译这
常量占内存吗
-
c中字符串常量的若干问题
本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一、 C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5'; p=&a;                     //显然是正确的, p="abcd";              //但为什么也可以这样赋值?? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点!   答:
内存区域的划分(堆栈区、常量区、静态区)
程序的内存分配     一个由C/C++编译的程序占用的内存分为以下几个部分   1、栈区(stack)    由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。    2、堆区(heap)    一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回收   。与数据结构中的堆是两回事,分配方式倒是类似于链表。
CUDA学习日志:常量内存和纹理内存
在上一篇博文中,我们谈到了如何利用共享内存来实现线程协作的问题。本篇博文我们主要来谈谈如何利用常量内存和纹理内存来提高程序性能。 Jeremy Lin 常量内存 所谓的常量内存,从它的名字我们就可以知道,它是用来保存在核函数执行期间不会发生变化的数据。NVIDIA硬件提供了64KB的常量内存,并且常量内存采用了不同于标准全局内存的处理方式。在某些情况下,用常量内存来替换全局内存可以有效地减少内存带宽。 常量内存的声明方式与共享内存是类似的。要使用常量内存,则需要在变量前面加上 __constant__修饰符
JAVA 中常量和变量做计算时的差异
在Java中,常量和变量的计算其实是存在差异的,二者的差异往往被我们所忽略,为了更好的理解其中的差异,首先看一道面试题: n byte b1=3,b2=4,b;n b = b1+b2;n b = 3+4;nnn哪句是编译失败的呢?为什么呢?nn再看一看下面的例子:npublic class Demo1{n public static v
C语言中定义常量的两种方式
http://www.cnblogs.com/jiajinghai/archive/2011/11/08/2241107.html 我们在用C编程时有时需要定义不变的变量,即常量,有两种方法。举例说明。 定义常量PI的两种方式: 1. #define Pi 3.1415926f; 2. const float pi 3.1415926f; 区别: 第一种方式:是
c# 常量(const) 使用的注意事项
在我们编码的过程 ,const 是我们经常用到的一种声明类型,如果不了解const的运行机制,有时候会发生一些莫名其妙的bug,可能让我们掉入深坑中。  接下来我们一起看看常量的应用吧!1.常量默认是静态类型,所以不能和static一起使用2.常量是在编译时计算的,它的表达式中不能包含变量:       如  const  int a= b+1; 这样编译不能通过的      如果 const i...
cuda常量内存的使用
首先声明一个常量数组,给定大小。再定义一个cpu上的数组rn_constant_  s[100];rnint temp[3]={1,2,3};rn然后把数据从内存复制到常量rncudaMemcpyToSymbol(s,temp,sizeof(int)*sizeof(temp));
从字符串常量起说内存分配
char p[];char *p;char *p=new char[]; #include using namespace std; const int n=20; int main() { char p[]="hello world"; //correct //char *p2="hello world"; //char *p=new char[n];
字符型数据(字符常量和字符串常量)使用及区别
1-字符型     在各种不同系统中,字符类型都占一个字节(8位)。定义如下:   char c='a';//C 语言中,使用单引号把字符引起来构成字符常量,双引号"abc"是字符串常量也可以用字符对应的ASCII码赋值,如下:   char c=97;      char c='good';得到的是最后一个字符 即'd'      C语言是ASCII码的形式存储字符型变
C++中修改常量值的方法
1.无法对全局常量,静态常量重新赋值,会引发编译错误或者运行时错误2.对函数内的局部常量可以重新赋值,但是并不会改变值,只是不会报错,所以没什么卵用3.可以对类中的成员常量进行重新赋值,主要的方法就是通过获取原常量的底层常量指针,使用强制类型转换,将常量指针改变成非常量指针,然后通过非常量指针进行赋值。例子如下class AClass{ private: const int x; i
note : OD操作整理-修改常量字符串;保存PE文件
常量字符串的查找 修改常量字符串 保存修改后的PE文件
define定义常量加括号,不加括号区别
#define ADD1 a+b #define ADD2 (a+b) void main() { int a=10; int b=20; // 你想计算(10+20)*3 int c, d; c = ADD1*3; d = ADD2*3; } 经过宏替换,就变成了下面的样子: c = a+b*3; d = (a+b)*3;
#define 和 const 定义常量比较。
在C++中可以使用#define或者const来定义常量,但是使用const相比起#define有更多的优点。——–<Effective C++>以下部分内容选自<程序猿面试宝典> const 常量有数据类型,而宏常量是没有数据类型。编译器可以对前者进行类型安全检查,而后者仅仅进行字符替换,没有类型安全检查,并且在字符替换过程中会产生一些意料不到的错误。(边际效应) #define X 10 #de
【笨鸟先飞】android重新学习日记9--- 常量数据的储存位置
常量数据在java的学习的时候提到过,常量数据的意义是避免,魔术参数,魔术数值,魔术常量,这些称呼都可以,总之就是在方法的代码中,不建议使用直接的数在进行运算。   Java重新学习里面也提到,使用常量的话,使用这些前缀来完成。 Public static final int CONTENT_NUMBER = 1;   Android对于这些情况进行了优化,将所有的常量进行了统一存放,存
C语言之变量、常量(define\const)、变量的声明和定义
#include #include #include void main(){ int num = 10; int num1 = 20; int num2 = 30; //十进制,内存地址 printf("%d,%x",num,&num); printf("%d,%d", num1, num2); //打开提示窗口 MessageBoxA(0,"content","title",
C++ 引用和指针的区别 常量指针和指针常量的区别
       指针指向一块内存,它的内容是所指内存的地址;       引用是某块内存的别名    引用的一些规则如下:    (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。    (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。    (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)*和const谁在前,就先念谁...
Java虚拟机(2)-Java常量,变量,对象(字面量)在内存中的存储位置
针对Java中的常量,变量,字面量,对象的存储,略作总结.总结:new出的对象存储堆中,””存储常量池中,基本类型字面量为常量或静态变量时,存储在常量池,为成员变量存储在堆中,为局部变量存储在栈中.
理解const的内存分配
理解const的内存分配1. 基础知识在C语言例,const的含义是被称为一个不能被改变的普通变量,而在C++中其含义就不尽相同。尤其,目前许多的资料都指出:C++中的const常量,C++编译器都会尽量避免const 常量的内存分配,只有当不得已的时候才会分配具体的内存空间给const变量。具体什么情况下会分配内存给const变量,目前已经确定的有如下几种情况:2. 解析const int作为全局
java中变量 常量的存储
实用举例:  1:堆栈(stack)  方法的参数值  public void sun (int a , int b)   //调用方法是在栈内存中为参数分配存储空间,方法结束自动释放。  局部变量  public static void main(String[] args){  int a = 5;   } //在方法中的局部变量,存储在栈内存中,方法结束时候,释放内存 引用变量 
相关热词 c#俄罗斯方块源码 c# linq原理 c# 装箱有什么用 c#集合 复制 c# 一个字符串分组 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类