通过指针改变字符数组的值 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thomaswang

通过指针改变字符数组的值

  •  
  •   thomaswang 2018 年 3 月 22 日 1799 次点击
    这是一个创建于 2954 天前的主题,其中的信息可能已经有所发展或是发生改变。
     char *name = "abc"; printf("%c\n", name[1]); printf("%c\n", *(name + 1)); *(name + 1) = 'B'; 

    结果:

    b b Bus error: 10 

    我想把 b -> B 这样操作为啥不行,应该怎么做呢

    11 条回复    2018-05-22 18:09:20 +08:00
    pkookp8
        1
    pkookp8  
       2018 年 3 月 22 日 via Android
    abc 在字符常量区,了解一下
    ShadowStar
        2
    ShadowStar  
       2018 年 3 月 22 日
    char name[] = "abc";
    thomaswang
        3
    thomaswang  
    OP
       2018 年 3 月 22 日
    @pkookp8
    @ShadowStar
    ```
    char name2[] = "abc";
    printf("%c\n", name2[1]);
    printf("%c\n", *(name2 + 1));
    name2[1] = 'A';
    printf("%s\n", name2);

    ```
    thomaswang
        4
    thomaswang  
    OP
       2018 年 3 月 22 日
    结果:
    b
    b
    aAc

    这样就是可以的, 为什么呢
    des
        5
    des  
       2018 年 3 月 22 日 via Android
    @thomaswang 一楼已经说过了
    pkookp8
        6
    pkookp8  
       2018 年 3 月 22 日 via Android
    @thomaswang 前者存在字符常量区,抄袭的时候就确定了,你可以打开编译后的二进制文件搜索 abc,改了再运行打出来。指针指向字符常量区的地址是不可改变的,只读区域,除非能把内存里加载的二进制文件改了。后者是数组,abc 从常量区压入了栈,栈是一块可读写的区域。栈由系统自动申请释放。
    希望没说错
    pkookp8
        7
    pkookp8  
       2018 年 3 月 22 日 via Android
    @pkookp8 抄袭->编译
    roychan
        8
    roychan  
       2018 年 3 月 22 日
    char* 出来的字符串在 .text 里,只读。而 char[] 出来的在 stack 上,可读可写。
    liuminghao233
        9
    liuminghao233  
       2018 年 3 月 22 日 via iPhone
    const 的东西怎么改
    thomaswang
        10
    thomaswang  
    OP
       2018 年 5 月 22 日
    ```
    char *name1 = "zhangsan";
    char name2 = "zhangsan";
    ```
    它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
    thomaswang
        11
    thomaswang  
    OP
       2018 年 5 月 22 日
    @thomaswang

    ``` c

    char *name1 = "zhangsan";
    char name2 = "zhangsan";

    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5612 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 06:24 PVG 14:24 LAX 23:24 JFK 02:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86