CPP-基础:文字常量区
内存不可写 char*
先看一个例子
/////////////
//代码1
#include <string> main()
{
char *buf = "good morning.";
char *p;
p = strchr(buf, 'd'); *p = 'h'; // 此处不可以进行赋值.提示出错,内存不可写 printf("%s", p);
return ;
} /////////////////////////////
//代码2
#include <string>
int main(void)
{
char buf[] = "good morning.";
char *p;
p = strchr(buf, 'd'); *p = 'h'; // 此处赋值不会有问题. printf("%s", p);
return ;
}
这是为什么呢?关键原因在于"good morning."存放的位置,"下面进行分析
(1) 可以肯定的是不论是代码1 还是代码2, "good morning."都是存放在文字常量区中的。文字常量区是一个静态存储区, 对它进行修改是不允许的。
(2) 代码1 和代码2 中 buf 都是存放在函数的栈中。
(3) 代码2在运行时会将静态区中的 “good morning." 复制一份到函数的栈中, 而 buf指向的是栈内的地址,因此对它进行修改不会产生任何问题。 但是代码1不会将静态区中的 "good morning."复制到栈中,因此对指针的内容进行修改会产生错误。
(4) 事实上脱离编译器而谈论这个问题是没有意义的,因为一些编译器可能是采用以上的方式进行编译,而另外一些采用其他的方式,可能代码1和代码2都产生错误, 也可能都没有运行错误。
事实上一个由 C / C++编译的程序占用的内存分为以下几个部分:
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,默认可读写.
2、堆区(heap) — 一般由程序员分配释放(new、malloc等), 若程序员不释放,程序结束时可能由 OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,默认可读写
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束后由系统释放 ,默认可读写.
4、文字常量区 —常量字符串就是放在这里的,程序结束后由系统释放,只读.
5、程序代码区—存放函数体的二进制代码,只读.
CPP-基础:文字常量区的更多相关文章
- c语言—栈区,堆区,全局区,文字常量区,程序代码区 详解
转:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(sta ...
- 从内存的角度观察 堆、栈、全局区(静态区)(static)、文字常量区、程序代码区
之前写了一篇堆栈的,这里再补充下内存其他的区域 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程 ...
- C++中栈区 堆区 常量区
原文地址:http://blog.csdn.net/xcyuzhen/article/details/4543264 C++中栈区 堆区 常量区(由一道面试题目而学习) -- : #include&l ...
- c语言知识点总结-------静态区、堆、栈、常量区等
在C语言中地址占4个字节 1.编程语言发展 低级语言----->高级语言 机器语言 ---> 汇编---->高级语言(C语言.C++.JAVA等) 机器语言 :0101 0010 1 ...
- C/C++文字常量与常变量的概念与区别 分类: C/C++ 2015-06-10 22:56 111人阅读 评论(0) 收藏
以下代码使用平台是Windows 64bits+VS2012. 在C/C++编程时,经常遇到以下几个概念:常量.文字常量.符号常量.字面常量.常变量.字符串常量和字符常量,网上博客资料也是千篇千律,不 ...
- JAVA_SE基础——7.常量&变量
上一篇,我讲了标识符&关键字 这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...
- CPP基础
CPP基础1. 如果没有指明访问限定符(public,private),class中默认的private,而struct中的成员默认是public的. #include <iostream> ...
- Swift语言指南(一)--语言基础之常量和变量
原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...
- char*赋值在常量区,不可以修改
char*赋值在常量区,不可以修改,要想修改,用数组. char* = "abc";*(pCh+1) = 'k';//编译正常,运行报错. char pCh[] = "a ...
随机推荐
- 禁用选择文本功能user-select
有时候,我们为了用户体验,需要禁用选择文本功能. 这需要用到一个CSS属性:user-select,user-select的文档点这里 user-select有两个值:none:用户不能选择文本tex ...
- USACO 5.4 tour的dp解法
题意:有n个点排成序列,两个人甲乙从1出发,到达n,中间的点不允许到达两次,只能从左向右走,问最多两人访问多少点. (膜大佬) 解: dp f(i, j) 表示甲到了i点,乙到了j点,两人最多访问了多 ...
- mysql连接过多-报错
有两种方法: 1,错误连接参数 max_connect_errors,在配置文件中调整增大. 比如:修改mysql配置文件,在[mysqld]字段下面添加 max_connect_errors=102 ...
- 任务26:dotnet watch run 和attach到进程调试
任务26:dotnet watch run 和attach到进程调试 dotnet watch run 的一种调试方法 打开VSCode,先关闭当前的文件夹 Ctrl+~快捷键 打开窗体. ls应该是 ...
- django QQ认证登录
一.开发环境 django 1.10.2 python3.5.2 django-social-auth 0.3.6 二.申请QQ互联 APPID及SECRECT_KEY 大致步骤: 1.成为QQ互联开 ...
- bzoj 2064: 分裂【状压dp】
参考:https://www.cnblogs.com/liu-runda/p/6019426.html 有点神奇 大概就是显然最直观的转移是全部合起来再一个一个拆,是n+m次,然后设f[i][j]为分 ...
- GitHub笔记---邮箱访问错误
GitHub地址太长,所以需要一个变量来保存 把远程仓库赋值给一个变量,以后就用就这变量代表这个地址 GitHub推送push 推送过程中发生一个小插曲,出现了错误,错误提示我复制过来吧 remote ...
- web.xml报错:Invalid content was found starting with element 'init-param'
问题与分析 在web.xml中配置servlet节点时报错如下: cvc-complex-type.2.4.a: Invalid content was found starting with ele ...
- 数字(number)
数字(number) Time Limit:2000ms Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...
- C#之九大视图
本节向大家介绍一下有关UML视图方面的内容,UML视图共有9种,它们之间有什么区别和联系呢,下面就让我们一起来学习吧,相信通过本节的介绍你一定会有不少收获. UML视图 UML总共提供了9种视图,这些 ...