首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C++中,当一个字符串被赋值给一个指针时,为什么它存储的是只读的?

在C++中,当一个字符串被赋值给一个指针时,它存储的是只读的,是因为C++中的字符串字面值是常量字符数组,它们被存储在只读数据段(常量区),而指针是指向内存地址的变量,指向常量数据的指针默认是指向只读的。

当一个字符串字面值被赋值给一个指针时,这个指针实际上指向了字符串字面值在内存中的起始地址。由于字符串字面值是只读的,C++编译器会将其存储在只读数据段,而不允许通过指针修改这些只读数据。

这样设计的好处是保证了字符串字面值的不可变性,提高了程序的安全性和性能。如果允许通过指针修改字符串字面值,可能导致程序运行时出现不可预料的错误或者崩溃。

对于需要修改字符串的情况,可以使用字符数组或者string类来代替指针,这样可以在内存中创建可写的字符串副本,并进行修改操作。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云C++ SDK:https://cloud.tencent.com/document/product/213/38236
  • 腾讯云容器服务:https://cloud.tencent.com/product/ccs
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云函数计算(SCF):https://cloud.tencent.com/product/scf
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
相关搜索:C++在函数中将指针本地赋值给另一个指针-未定义的行为?当试图给一个函数赋值元素时,使用一个接受数组指针的函数有什么错?为什么在c++中赋值字符数组元素时,被赋值的字符会被销毁?赋值给名称存储在bash中另一个变量中的变量为什么在它()内部的cypress变量仍然是赋值给该变量的最后一个值,而在它的外部()它可以正常工作?(示例)为什么当一个表是一个类的属性时,改变它的变量名不起作用?既然number是一个原始类型,为什么它在重新赋值给另一个变量时会改变它的值呢?当一个元素被javascript中的另一个元素触摸时,我如何改变它的位置?当docker容器中的一个进程被终止时,为什么会有其他无关的进程被终止当从文件(指针)中获取数据时,如何构建一个将数据存储在结构中的函数?当一个参数为常量时,在C中更改函数指针的签名为什么这个指针在计算sum时传递的是一个值而不是地址?当一个类的成员被存储为没有这种方法的父类的对象时,如何访问它的成员?为什么在将array.find的结果赋值给一个变量时,我得不到定义?如果C++对象的类是在另一个boost模块中声明的,那么如何使用boost将该对象的指针返回给python?当赋值规则存储在另一个tibble中时,如何将tibble中的数据替换为新值?在C++中,我如何修复一个指针类的变量在我调用它时变成一个空的how?为什么当结构被分配给另一个相同类型的结构时,它仍然保持为空?当一个类的实例本身被创建时,为什么构造函数中的语句不被执行呢?为什么我的状态在默认情况下被设置为一个空数组,它仍然是欠定义的?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一个C#开发者重温C++心路历程

接着,我们用取地址符号&,取出i变量地址指针,然后指针变量*ipointeripointer存储i地址,而*ipointer存储518,如下图: ?...那么,我们明明把i地址了变量*ipointer,为什么*ipointer存储518呢? 因为。。。就是这么屌。。。 哈哈,不开玩笑了,我们先看这样一段代码,就可以理解了。...也就是说,如果我们不使用【引用符&】来传递指针,那么指针就是只读,无法修改。 另外,大家应该也注意到了,指针引用传递,【引用符&】*和变量之间,如果*&k。...i函数constusage,无法修改,一但赋值就报错。 呃。。。基于C#,估计肯定不好理解这个const存在意义了,因为如果不想改,就别改啊,标只读这么费劲干什么。。。...那么,为什么创建文件,会给我们设置一个预编译头呢?微软这么做肯定是有目的。 我们通过名字,字面推测一下。 pch.h预编译头,那么对应英文,大概就是Precompile Header。

83330

C语言标准定义32个关键字保姆级讲解

而void类型指针移动你并不知道指向存储空间大小。但是GNU标准允许对void类型指针进行加减操作。...C语言中,const定义并不是真正常量,而是具有只读属性变量,其本质还是变量,只不过不可修改(实际上C语言中可以通过指针等其他方式间接修改);而在C++,const定义真正常量,C...#define预编译时候进行宏替换,而const只读变量在编译确定值。另外,#define定义常量没有类型,而const修饰只读变量有类型。...变量a赋值,编译器取到val值之后赋a,并且这个值会被放到缓存。...也就是说,在给a赋值,编译器将会在val地址处取值,b赋值,编译器依然会去val变量地址处取值。

9910
  • c++】类和对象(二)this指针

    : Date类中有 Init 与 Print 两个成员函数,函数体没有关于不同对象区分,也就是说,d1和d2调用一个函数,那d1调用 Init 函数,该函数如何知道应该设置d1对象,而不是设置...,不需要用户传递 this指针类型:类类型* const,(Date* const this)即成员函数,不能给this指针赋值,但是this指向内容可以改变 特点: 形参和实参位置,我们不能显示写出来...C++,const修饰局部变量默认存储栈上,但是编译器优化可能会将其存储程序只读数据段(常量区),尤其它被视为编译时常量。...字符串常量"abcdefg"存储常量区(也称为字符串字面量区或只读数据段),这是因为字符串字面量程序整个生命周期内都不应修改。...在上述讲解后,我们能够推出this指针存储位置:this一个形参,指向调用该成员函数对象,this指针成员函数调用时需要被快速访问并用于访问对象成员,所以我们推测存储栈上 为了提高访问速度

    9210

    CC++常见面试知识点总结附面试真题—-20220326更新

    或者左值就是程序能够寻址东西,右值就是一个具体真实值或者对象,没法取到地址东西(不完全准确),因此没法对右值进行赋值,但是右值并非不可修改,比如自己定义class, 可以通过成员函数来修改右值...对指针赋值时候应该注意赋值指针需要不需要释放. 4). 动态分配内存指针最好不要再次赋值. 5). C++应该优先考虑使用智能指针. 9. C++11 中有哪些智能指针?...补充: 1). c局部const常量存储栈空间,全局const常量存在只读存储区,所以全局const常量也是无法修改,它是一个只读变量。 2)....C++程序调用C编译器编译后函数,为什么要加extern“C”?...pop()函数返回“弹出值”(也就是从栈中将这个值移除),会有一个潜在问题:这个值返回到调用函数时候,栈才改变;但拷贝数据时候,调用函数抛出一个异常会怎么样?

    1.5K10

    C++缺陷与思考(上)

    (七)赋值语句返回值 C/C++赋值语句自带返回值,这一定算得上一大缺陷,C赋值语句返回值,C++赋值语句返回左值引用。...我们按照上面对左右值分析,一个变量做右值,该变量只读,不会被修改,那么,“引用”这个变量自然想让引用成为这个变量替身,而如果我们希望这里做事情通过这个引用来操作实体时候,实体不能改变...GetAnObj函数内部,t一个局部变量,局部变量生命周期从创建到当前代码块结束,也就是说,GetAnObj函数结束,这个t一定会被释放掉。...所以,一个const引用绑定一个将亡值,const引用相当于这个对象“快照”,但背后还是间接地延长了生命周期,但只不过不可变。...,C++当中,并不只有显式调用=时候才会赋值函数传参时候仍然由赋值语义(也就是实参赋值形参)。

    1.5K50

    CC++ const

    constC语言关键字,经C++扩充,功能变得强大,用法复杂。const用于定义一个常变量(只读变量)。const与指针、引用、函数等结合起来使用时,情况会变得更加复杂。...(4)非只读对象(如a1)调用某个函数,先寻找非const函数版本,如果没有找到,再调用它const函数版本。而常对象(a2),只能调用类定义常函数,否则出现编译错误。...4.常见对const误解 (1)误解一:用const修改变量值一定是不能改变const修饰局部变量存储只读存储,通过指针可间接修改。...>还提到,通常C++编译器并不为const变量创建存储空间,相反它把这个定义保存在符号表里,除非像extern const int a;使用extern进行定义(另外一些情况,...此外,还需要注意为什么使用const定义变量C++编译器并不为const变量创建存储空间,相反把这个定义保存在符号表里。那是因为编译时会进行常量折叠。

    86010

    CString 和 char* 类型转化

    1、CString 转化成 char*(1) —— 强制类型转换为 LPCTSTR   这是一种略微硬性转换,我们首先要了解 CString 一种很特殊 C++ 对象,里面包含了三个值:一个指向某个数据缓冲区指针...同时,还应该注意,如果你有一个常量串指针,这个串本身存储只读内存,如果试图存储,即使你已经调用了 GetBuffer ,并获得一个只读内存指针,存入操作会失败,并报告存取错误。...C 程序员有一个通病分配一个固定长度缓冲,对进行 sprintf 操作,然后将它赋值一个 CString: char buffer[256]; sprintf(buffer, "%.........GetBuffer 返回正确,但是当我把赋值 char* ,它就变成垃圾了。...所以 GetBuffer 本来返回指向这个临时对象字符串地址指针,但是这个临时对象析构后,这块内存就被释放了。

    6.3K20

    0xc0000005发生访问冲突解决_更改兼容性还是c0000005

    发生这个问题,一般意味着: 访问数组元素发生了 越界; 将静态常量地址赋了普通指针(可读写指针),随后又尝试写该普通指针指向实体,这等价于写访问一个只读内存块; 对空指针或野指针解引用...char * 型,不应该赋 char * ... mystr[0] = 'c'; // 0xC0000005 这里问题:直接用双引号 "" 给出字符串,对应着一个保存在可执行文件 char...数组,也叫 字符数组常量,这种数组会在程序加载阶段放置在内存静态区 —— 更准确地说,位于静态区 rodata 段 —— 这些内存块写保护(严格只读。...由于 数组可以退化为指针,所以把这种字符数组赋值 char 指针一种隐式取址操作,而不是拷贝。编译器并不知道你要拿这个指针干什么,会不会进行写操作,所以编译通过;运行时崩溃。...// 不用 return 0 了,程序崩溃(0xC0000005) } 有经验一眼就能看出问题,这无非指针解引用;新手却看不出来,迷惑性在于:野指针现在位于一个指针数组,并且看起来我们“明明已经用

    91120

    整理了70道C语言与C++常见问答题

    例如全局变量,static 变量,常量字符串等。 栈上分配: 执行函数,函数内局部变量存储单元都在栈上创建,函数执行结束这些存储单元自动释 放。...常量指针 指定义了一个指针,这个指针指向一个只读对象,不能通过常量指针来改变这个对象值。 指针常量强调指针不可改变性,而常量指针强调指针对其所指对象不可改变性。...多态性:将父类对象设置成为和一个或更多子对象相等技术。用子类对象父类对象赋值 之后,父类对象就可以根据当前赋值给它子对象特性以不同方式运作。...另外unique_ptr还有更聪明地方:程序试图将一个 unique_ptr 赋值一个,如果源 unique_ptr 个临时右值,编译器允许这么做;如果源 unique_ptr 将存在一段时间...「注意」:有类中有指针类型成员变量,一定要重写拷贝构造函数和赋值运算符,不要使用默认 。 41 C++,使用malloc申请内存能否通过delete释放?

    3K01

    C语言中const竟是个 冒牌货

    其实在 c++语言里面const修饰才算是一个真正常量, c 语言中 const 可以说是个“冒牌货”。为什么会这样?...其实是 c++ 编译器对 const 进行了加强, c++ 编译器遇到常量声明时,不会像 c 语言一样这样const对象单独分配内存,c 语言一般放在只读数据区,而 c ++ 编译器把const...对象放在一个符号表里面(我个人觉得放在符号表里面的其中一个原因可能想减少一些存储操作次数),至于符号表属于内存布局(文章:你该知道你写程序内存布局)哪一块,我也不知道,写 c++ 编译器的人才知道...a 取地址(&a)时候,c++ 编译器会为这个a单独分配一个内存空间,如果定义一个指针指向这个内存空间(int *p = (int *)&a;),那么这个指针指向这个新分配一个内存空间,然后通过这个指针间接修改这个值...("pause"); } // 打印结果:*p = 11 a = 10 从打印可以看出单独分配这个内存空间值11,和原来 a 不同两个概念,这就是 C++ const 符号表实现机制

    41210

    1.C和C++区别,以及const分析(底层const顶层const)

    由于指针修改只读存储数据,所以导致程序崩溃 3. C++const 3.1 介绍 C++,const变量则是真正常量了,定义时会将其放入符号表....所以编译途中遇到使用const变量,则直接从符号表取出常量. 只要该const变量为全局(使用extern声明过),或者使用&操作符,才会被分配存储空间.... mutable 修饰变量,将永远处于可变状态,即使一个 const 函数,甚至结构体变量或者类对象为 const,其 mutable 成员也可以修改。...,不能进行优化 1)c++,使用volatile const,编译器不会将其放入常数表,而是以只读变量形式来定义 例如: volatile const int x=1; int *...p= (int *)&x; *p=2; printf("x=%d\r\n",x); 输出结果: x=2 2) 使用const,赋予volatile类型,也是以只读变量形式

    84520

    C++知识概要

    存储静态存储区,作用域仍为局部作用域,定义函数或者语句块结束时候,作用域结束。...) 派生类自己构造函数 必须使用成员列表初始化四种情况 当初始化一个引用成员 当初始化一个常量成员 调用一个基类构造函数,而拥有一组参数 调用一个成员类构造函数,而拥有一组参数...应该注意 *pf 两边括号必须否则就是声明了一个返回int *类型函数 函数指针赋值 指针名 = 函数名; 指针名 = &函数名; c/c++内存分配,详细说一下栈、堆、静态存储区...这两者存储方式上并无不同。这两者区别在于非静态全局变量作用域整个源程序,一个源程序由多个原文件组成,非静态全局变量各个源文件中都是有效。...对于内置数据类型传递,直接赋值拷贝形参(注意形参函数内局部变量);对于类类型传递,需要首先调用该类拷贝构造函数来初始化形参(局部对象)。

    1.1K20

    C++】类型转换 ⑤ ( 常量和非常量之间类型转换 - 常量类型转换 const_cast | const 左数右指原则 | 代码示例 )

    d , const 修饰 char * , 指针不能修改 ; 这是 指针常量 ; const 关键字 指针符号 * 右侧 表示定义指针常量 ( 指针本身不能修改 ) ; /...常量类型 转为 变量类型 , 以及 将 变量类型 转为 常量类型 ; 常量类型转换 const_cast 最大作用就是 去掉 只读属性 ; 2、常量不能直接修改 函数接收一个 常量字符串 , const...使用 常量类型转换 const_cast , 开发者必须确保 指针指向 空间可以修改 , 如果不能修改 , 强行修改 , 会带来未知灾难性后果 ; 如 : 定义了 字符串常量 , 字符串常量...不会分配内存 , 而是 存储了 符号表 ; // 此处直接定义了一个常量字符串 // 该常量字符串没有分配内存 // 该常量存储了 符号表 const char * str = "...博客 , 该博客详细介绍了 C 语言常量 和 C++ 常量原理 , C++ 常量都是存储符号表 , 符号表值肯定是不能修改 ; 使用 常量类型转换 const_cast , 强行将

    38110

    【cc++】深入探秘:C++内存管理机制

    ) ptr1 局部指针变量,存储栈上 *ptr1 指向内容(即通过malloc分配内存)存储堆上 *char2(局部字符数组) 当你声明一个局部字符数组并用一个字符串字面量初始化,如char...";,这个字符串字面量存储程序只读数据段(或称为代码段、常量区)。...*pChar3常量区,因为指向一个字符串字面量,字符串字面量存储程序常量区域,这部分内存只读。...一个函数调用时,其局部变量和一些书keeping信息推入栈函数执行完成,这些信息从栈上弹出。栈自动管理,开发者无需手动分配或释放内存。 堆用于动态内存分配内存区域。...使用realloc,如果分配失败,原始内存不会被释放。因此,建议先将realloc返回值赋一个临时指针,以检查是否分配成功,再重新赋值原始指针,以避免内存泄漏。

    21510

    终极 C++避坑指南

    赋值语句返回值 C/C++赋值语句自带返回值,这一定算得上一大缺陷, C 赋值语句返回值, C++赋值语句返回左值引用。...我们按照上面对左右值分析,一个变量做右值,该变量只读,不会被修改,那么,“引用”这个变量自然想让引用成为这个变量替身,而如果我们希望这里做事情通过这个引用来操作实体时候,实体不能改变...所以,一个 const 引用绑定一个将亡值,const 引用相当于这个对象“快照”,但背后还是间接地延长了生命周期,但只不过不可变。...,C++当中,并不只有显式调用=时候才会赋值函数传参时候仍然由赋值语义(也就是实参赋值形参)。...编译期会将字符串常量存储一个全局区,然后再使用字符串常量位置用一个指针代替。所以基本可以等价认为,字符串常量(字面量)const char *类型。

    2.2K20

    你们要C++面试题答案来了--基础篇

    为什么要使用智能指针: 智能指针作用是管理一个指针,因为存在以下这种情况:申请空间函数结束忘记释放,造成内存泄漏。...另外unique_ptr还有更聪明地方:程序试图将一个 unique_ptr 赋值一个,如果源 unique_ptr 个临时右值,编译器允许这么做;如果源 unique_ptr 将存在一段时间...栈对象生存周期结束后,会在析构函数释放掉申请内存,从而防止内存泄漏。C++ 11最常用智能指针类型为shared_ptr,采用引用计数方法,记录当前内存资源多少个智能指针引用。...参考回答: C++,虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区以及栈区六部分。 代码段:包括只读存储区和文本区,其中只读存储存储字符串常量,文本区存储程序机器代码。...其逻辑地址其划分如下: 各个段说明如下: 3G用户空间和1G内核空间 静态区域: text segment(代码段):包括只读存储区和文本区,其中只读存储存储字符串常量,文本区存储程序机器代码。

    2.9K31

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    1、C++内存分为哪几块? 栈,执行函数,函数内局部变量存储单元都可以栈上创建,函数执行结束这些存储单元自动释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配内存容量有限。...全局/静态存储区,全局变量和静态变量分配到同一块内存以前C语言中,全局变量又分为初始化和未初始化C++里面没有这个区分了,他们共同占用同一块内存区。...指针一个变量,存储一个地址,引用跟原来变量实质上一个东西,原变量别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且定义必须初始化 指针初始化后可以改变指向...浅拷贝: 拥有指针成员一个对象利用拷贝构造函数或者赋值函数拷贝或者赋值一个对象时候,直接将这个对象指针成员赋值一个对象指针成员,将一个指针赋值一个指针,就会使两个指针指向同一个空间...深拷贝: 拷贝构造函数或赋值函数不是直接指针另外一个对象指针,而是新开辟一块内存空间,将被拷贝或赋值对象指针成员指向新开辟内存空间,然后再将数据拷贝过去。

    2K20

    模拟实现C++string类(详细解析)

    string对象字符串,需要一个'\0',所以_str开辟一个字符空间,用来存放'\0',然后将字符串有效个数和字符串空间赋值为0. ②带参构造函数string(const char* str...如果"\0",这个可以,这个跟""类似,""一个'\0',而"\0"字符串,里面有两个"\0",计算出来长度都为0. ③拷贝构造函数 拷贝构造函数,C++,有两种版本写法,称为传统版本和现代版本...何为C格式字符串c里面,一个字符指针拿到字符串首元素地址。使用这个函数,就可以拿到这个地址了。...C/C++类型于相较大类型做运算,小类型会向大类型提升,比如int跟double做运算,int会提升为double。 其解决方法就是,将pos强制转换成int类型。...,联合体用来定义string字 符串存储空间: ①字符串长度小于16,使用内部固定字符数组来存放 ②字符串长度大于等于16,从堆上开辟空间 union _Bxty { char

    84520

    const关键字到底该什么用

    前言 我们都知道使用const关键字限定一个变量为只读,但它是真正意义上只读吗?实际又该如何使用const关键字?解答这些问题之前,我们需要先理解const关键字基本使用。...本文说明Cconst关键字,不包括C++。 基本介绍 constconstant简写,不变意思。但并不是说它修饰常量,而是说它限定一个变量为只读。...修饰变量真正意义上只读吗?为什么修饰变量值仍然可以改变?...当然这一个例子并不能说明所有的问题。但是我们要知道,const关键字告诉了编译器,修饰变量不能改变,如果代码中发现有类似改变该变量操作,那么编译器就会捕捉这个错误。...对于不该被修改入参,应该用const修饰,这是const使用常见姿势。 const修饰变量只能正常赋值一次。 不要试图将非const数据地址赋普通指针

    57820
    领券