确保你想要修改的char*是可以修改的

void change(char *source)
{
source[0] = ‘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[6];
strcpy_s(c, 6, "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*

时间: 2024-08-03 07:14:33

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

Android逆向之旅---应用的&quot;反调试&quot;方案解析(附加修改IDA调试端口和修改内核信息)

一.前言 在前一篇文章中详细介绍了Android现阶段可以采用的几种反调试方案策略,我们在破解逆向应用的时候,一般现在第一步都回去解决反调试,不然后续步骤无法进行,当然如果你是静态分析的话获取就没必要了.但是有时候必须要借助动态调试方可破解,就需要进行操作了.现阶段反调试策略主要包括以下几种方式: 第一.自己附加进程,先占坑,ptrace(PTRACE_TRACEME, 0, 0, 0)!第二.签名校验不可或缺的一个选择,本地校验和服务端校验双管齐下!第三.借助系统api判断应用调试状态和调试属

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

对你有助请点赞,请顶------送人玫瑰,手留余香! 1:58 2016/3/12 整理PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释: PHPstorm配置:修改使用phpstorm创建的模板的默认注释 注意:我的也是phpstorm 10,但是配置的位置与下面参见的文章中描述的有所不同: 位置: 主要在一下两个路径: File | Settings | Appearance & Behavior | Appearance File | Set

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

开始学习hadoop啦!!! 在Ubuntu14.04上新建了一个名为hadoop的用户,但总是遇到各种权限问题,于是就想干脆把这个账户变成root账户. 网上查到说是直接修改/etc/sudoers,修改时提示read-only,修改不了,自然而然想到去修改文件的权限, sudo chown u+w /etc/sudoers,修改好了后发现sudo su要报错. 解决的办法是进入到Ubuntu的recovery mode中的root shell进行修改,遇到了和http://www.cnblo

Linux部署禅道及默认端口修改和附件大小限制修改和使用过程各种排坑

Linux部署禅道及默认端口修改和附件大小限制修改和使用过程各种排坑 本篇博客将分享本人在使用禅道是遇到的很多问题希望对大家有所帮助 有些问题只是发现了但现在的能力没办法解决希望大佬能提提意见给点帮助 参考文献:http://www.zentao.net/ 在此禅道的用途就不给大家多做解释了,直接进入正题:实验所需安装包:链接:https://pan.baidu.com/s/1UZaJeO5RFdlkPmSVlrdopw 密码:uame 注:官网上也可直接下载,在官网上有四个连接,国际版的大家可

在pdf上进行修改文字,PDF文字修改方法

PDF文件在办公领域使用的越来越多,许多刚刚接触过PDF格式文件的小伙伴一定被PDF文件修改难倒过.所以,今天小编就要告诉大家如何在PDF上进行修改文字,PDF文字修改方法是什么.操作软件:迅捷PDF编辑器1.首先我们用一个能够修改PDF文件的工具将我们需要修改文字的PDF文件给打开.2.我们找到界面上方的编辑内容按钮,点击编辑内容按钮中被红线框选的部分,这时候会弹出四个选项供我们选择,根据自己实际需求选择即可.3.选择后,我们就进入了编辑模式,双击需要修改的文字段,文字周边会出现蓝色框架,我们

怎么样修改PDF文件-PDF文件修改教程

怎么样修改PDF文件-PDF文件修改教程 现在网络上共享资源非常多,大家写个文章找个答案都会到网上进行一番搜索,可是网络上的很多资料都是PDF格式,或者直接是图片,对于这种情况,很不利于用户对资料的有效使用,有什么方法可以将pdf文件进行修改呢? 经过小编的网络上众多文字识别工具的测试,终于找到一款文字提取效果非常好的工具——捷速ocr文字识别软件. 一.工具下载及安装  1.捷速ocr文字识别软件 v2.0 免费版 2.安装过程比较简单,每一步都有相应的提示,用户只需三步即可轻松完成. 二.运

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

Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年3月1日 http://www.cnblogs.com/fanshuyao/ JDK安

如何防止网卡名被修改和还原已被修改的网卡名

防止网卡名被修改的方法: 1.  修改/etc/grub.conf,添加biosdevname=0.修改之后,执行reboot,设备重启之后会生成/etc/udev/rules.d/70-persistent-net.rules文件. # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a

svn 从文件上次修改以来没有任何文件修改或加入。

现象:代码已经被修改过了,但是再往svn上提交代码时仍然提示: 从文件上次修改以来没有任何文件修改或加入. 解决办法: 1.找打存放代码的文件夹,右键——TortoiseSVN——clean up(清理) 然后会谈一个框,点击确定即可