zoukankan      html  css  js  c++  java
  • 确保你想要修改的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*

  • 相关阅读:
    MySQL热备脚本
    从库查看状态的时候显示“ Last_Error”
    Jenkins+svn+maven
    confluence的安装、备份和恢复(wiki)
    RAP在centos上的部署
    不停止MySQL服务的情况下修改root的密码
    给Linux装图形化界面
    大文件传输工具
    MySQL server PID file could not be found!
    find常见用法
  • 原文地址:https://www.cnblogs.com/magicsoar/p/3721658.html
Copyright © 2011-2022 走看看