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*

  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/magicsoar/p/3721658.html
Copyright © 2011-2022 走看看