void change(char *source)
{
source[] = 'D';
cout<<source<<endl;
}

考虑一下,你有这么一个函数change它的作用是将传过来的字符串的第一个字符改成H,然后将这个字符串打印出来

谁知道这个函数为什么要这样呢?说不定编写这个函数的程序员的名字的第一个字母是D也说不定

好了,现在我们可以使用这个函数了

char a[] = "Peter";
change(a);

我们创建了一个字符串数组,它的内容是Peter

我们调用了change把Petter中的P改成了D,poor letter P

一切正常,我们得到了一个Deter

现在有人使用了如下的代码调用change

char *a= "Petter";
change(a);

或者你觉得创建一个变量太麻烦了,于是你直接传递了一个字符串过去

change("Peter");

然后可怕的事情发生了,你的程序产生了异常,崩溃掉了,编译器会告诉你写入位置 xxx 时发生访问冲突或者类似的错误原因,于是开始抱怨change函数编写者,他编写的函数怎么会让你的程序崩溃了。

无辜的change编写者,在承受着你的埋怨,因为事实的真相却是你向change函数传递了一个无法被更改的字符串

好吧,让我们看下下面的代码

char *a = "Peter";
char b[] = "Peter";
char *c = new char[];
strcpy_s(c, , "Peter");

a,b,c三个指针所指的内容都是peter,但这三个peter却位于不同的地方

a所指的Peter位于常量区

b所指的位于栈上

c所指的位于堆上

所以任何对a对source所指的内容的修改都会出现错误

但你可以让a指向一个新的地方,因为a是一个指针

a=b;

但对于位于栈上的b来说,你可以修改b所指的内容,

却不能修改b

b=a;// error 不能修改b

这是C/C++规定:数组不可以赋值,所以b相当于一个指针常量xxx *const

好了,让我们回过头来之前出错的那段代码

char *a= "Petter";
change(a);
change("Peter");

source所指的内容都是位于常量区的

所以任何对source所指的内容的修改都会出现错误

Remember

不要将一个字符串直接传递给一个函数或者赋值给一个char*类型的指针,除非你知道这个字符串中的字符的内容不会被改变

如何你可能会修改这个字符串的值,请使用char[],如果想使用字符串不变量,请使用const char*

确保你想要修改的char*是可以修改的的更多相关文章

  1. MySQL ALTER命令-修改数据表名或者修改数据表字段

    需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 删除,添加或修改表字段 如下命令使用了 ALTER 命令及 DROP 子句来删除表的 i 字段: ALTER TABLE ...

  2. 整理 PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释:

    对你有助请点赞,请顶------送人玫瑰,手留余香! 1:58 2016/3/12 整理PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释: PHPsto ...

  3. Ubuntu14.04 如何修改/etc/sudoers 和错误修改权限的解决办法

    开始学习hadoop啦!!! 在Ubuntu14.04上新建了一个名为hadoop的用户,但总是遇到各种权限问题,于是就想干脆把这个账户变成root账户. 网上查到说是直接修改/etc/sudoers ...

  4. dedecms自定义表单提交成功后提示信息修改和跳转链接修改

    我们在用dedecms自定义表单提交成功后提示信息一般是"Dedecms 提示信息",这个要怎么改成自己想要的文字呢?还有就是提示页停留时间,目前估计就2秒,太快了,要如何设置长点 ...

  5. mysql数据库新增、修改、删除字段和修改表名

    Mysql 删除,添加或修改表字段 删除 ALTER TABLE testalter_tbl DROP i; 新增 ALTER TABLE testalter_tbl ADD i INT; 指定位置新 ...

  6. CentOS6修改主机名(hostname)及 修改/etc/hosts 文件,增加ip和hostname的映射关系(转)

    CentOS修改主机名(hostname)  需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户. ...

  7. Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口

    Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口 >>>>>>>>>& ...

  8. 添加用户useradd,给用户设置修改密码passwd,修改用户信息usermod,修改用户密码状态chage,删除用户userdel,查询用户及组id,切换用户su,查看当前环境变量env

    useradd 用户名 passwd 用户名,给指定用户设密码 passwd给当前用户设密码 添加一个用户系统会自动在以下文件或目录创建对应用户信息: [root@localhost ~]# grep ...

  9. 不修改模板的前提下修改VisualState中的某些值

    原文链接:不修改模板的前提下修改VisualState中的某些值 - 超威蓝火 UWP里有一件非常令人不爽的事,大部分控件只提供了Normal状态下的Background,Foreground,Bor ...

随机推荐

  1. Noip前的大抱佛脚----Noip真题复习

    Noip前的大抱佛脚----Noip真题复习 Tags: Noip前的大抱佛脚 Noip2010 题目不难,但是三个半小时的话要写四道题还是需要码力,不过按照现在的实力应该不出意外可以AK的. 机器翻 ...

  2. mfc 类的析构函数

     析构函数  自定义析构函数 一.析构函数 析构函数(destructor) 与构造函数相反,当对象生命周期结束时(例如对象所在的函数已调用完毕),系统自动执行析构函数.析构函数往往用来做“清理善 ...

  3. 几种交叉验证(cross validation)方式的比较

    模型评价的目的:通过模型评价,我们知道当前训练模型的好坏,泛化能力如何?从而知道是否可以应用在解决问题上,如果不行,那又是哪里出了问题? train_test_split 在分类问题中,我们通常通过对 ...

  4. 4-[多进程]-互斥锁、Queue队列、生产者消费者

    1.互斥锁 (1)为什么需要互斥锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如下 #并发运行,效率 ...

  5. 实验二:ICMP重定向攻击

    -:实验原理 ICMP重定向信息是路由器向主机提供实时的路由信息,当一个主机收到ICMP重定向信息时,它就会根据这个信息来更新自己的路由表.由于缺乏必要的合法性检查,如果一个黑客想要被攻击的主机修改它 ...

  6. 使用html2canvas将html标签转化为图片

    有些时候我们无法用常规的截图工具截取网页内容,这时可以尝试以下方法: 1.首先允许跨域,Chrome浏览器可以在快捷方式->属性->目标栏里添加: --disable-web-securi ...

  7. C#多线程的几种使用

    参见链接   :http://www.jb51.net/article/46234.htm

  8. PHPCMS 栏目添加字段和修改描述textarea变成fceditor编辑器

    一.添加字段方法: 1. 添加数据库字段:description1,添加位置:v9_catetory表 找到phpcms/moudles/admin/templates/category_add.tp ...

  9. Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  10. Spring入门学习笔记(2)——基于Java的配置

    目录 基于Java的配置 @Configuration & @Bean Annotations Example 注入Bean依赖 @Import注解 Lifecycle Callbacks(声 ...