内存不可写 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-基础:文字常量区的更多相关文章

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

    转:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(sta ...

  2. 从内存的角度观察 堆、栈、全局区(静态区)(static)、文字常量区、程序代码区

    之前写了一篇堆栈的,这里再补充下内存其他的区域 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程 ...

  3. C++中栈区 堆区 常量区

    原文地址:http://blog.csdn.net/xcyuzhen/article/details/4543264 C++中栈区 堆区 常量区(由一道面试题目而学习) -- : #include&l ...

  4. c语言知识点总结-------静态区、堆、栈、常量区等

    在C语言中地址占4个字节 1.编程语言发展 低级语言----->高级语言 机器语言 ---> 汇编---->高级语言(C语言.C++.JAVA等) 机器语言 :0101 0010 1 ...

  5. C/C++文字常量与常变量的概念与区别 分类: C/C++ 2015-06-10 22:56 111人阅读 评论(0) 收藏

    以下代码使用平台是Windows 64bits+VS2012. 在C/C++编程时,经常遇到以下几个概念:常量.文字常量.符号常量.字面常量.常变量.字符串常量和字符常量,网上博客资料也是千篇千律,不 ...

  6. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

  7. CPP基础

    CPP基础1. 如果没有指明访问限定符(public,private),class中默认的private,而struct中的成员默认是public的. #include <iostream> ...

  8. Swift语言指南(一)--语言基础之常量和变量

    原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...

  9. char*赋值在常量区,不可以修改

    char*赋值在常量区,不可以修改,要想修改,用数组. char* = "abc";*(pCh+1) = 'k';//编译正常,运行报错. char pCh[] = "a ...

随机推荐

  1. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时1

    课时1 计算机视觉历史回顾与介绍上 CS231n:这一一门关于计算机视觉的课程,基于一种专用的模型架构,叫做神经网络(更细一点说,是卷积神经网络CNN).计算机视觉是人工智能领域中发展最为迅猛的一个分 ...

  2. display:inline-block的div 与 display:block的div之间有间隔问题(div与div之间有间隔的可能性)

    首先看一下我出现的问题如下图: 如上图所示,我的导航栏是由三部分组成的,三部分样式如下: .logo{ /*红框*/ position: relative; display: inline-block ...

  3. E20180421-hm

    ambiguous  adj. 模棱两可; 含糊的,不明确的; 引起歧义的; 有两种或多种意思的; simple  adj. 简单的; 单纯的; 易受骗的; 天真的; simplify  vt. 简化 ...

  4. python 容器 生成器 迭代器 总结

    一.容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中. >> ...

  5. 2.while循环 编码的初识,逻辑运算符 格式化输出

    while循环 循环 while True: # while 是关键字 条件 print('精忠报国') print('团结就是力量') print('北京欢迎你') print('葫芦爷爷救娃娃') ...

  6. 如何用Zookeeper来实现分布式锁?

    什么是Zookeeper临时顺序节点? 例如 : / 动物 植物 猫 仓鼠 荷花 松树 Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Zonde.# Znode分为四种类型 ...

  7. nginx添加模块

    [root@VM_0_3_centos nginx]# ./sbin/nginx -V nginx version: nginx/1.12.2 built by gcc 4.8.5 20150623 ...

  8. Python函数和面向对象题目

  9. 18.3.2从Class上获取信息(注解)

    package d18_3_1; /** * Class类上所包含的注解 * * getAnnotation(Class annotationClass) 获取该元素上指定的类型的注解 * getAn ...

  10. 转 Oracle中merge into的使用

    http://www.cnblogs.com/highriver/archive/2011/08/02/2125043.html