V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
b00tyhunt3r
V2EX  ›  程序员

C 语言 *p=0

  •  
  •   b00tyhunt3r · 2019-09-26 20:43:32 +08:00 · 1426 次点击
    这是一个创建于 1893 天前的主题,其中的信息可能已经有所发展或是发生改变。
      char c[5]="abcde";
      char* p = c;
      p=p+2;
      *p=0;
      printf("c[0]=%c,c[1]=%c,c[2]=%c,c[3]=%c,c[4]=%c\n",c[0],c[1],c[2],c[3],c[4]);
      printf("main:%s\n",c);
      fputs(c,stdout);
      
    

    输出:

    c[0]=a,c[1]=b,c[2]=^@,c[3]=d,c[4]=e
    main:ab
    ab
    

    可以看到在 p=p+2, * p= 0 后,指针 p 已经成功将 c[2]项释放,但 c[2]之后的 c[3],c[4]仍然没有被改变,

    然而此时无论用 printf 还是 fputs 输出字符串 c,为何都只能输出 ab,而不是 ab^@de ?

    先谢各位大佬指点!

    GeruzoniAnsasu
        1
    GeruzoniAnsasu  
       2019-09-26 20:45:32 +08:00 via Android
    本来想认真回一下,但是忍住了



    c 语言老师想打人
    thinkIn
        2
    thinkIn  
       2019-09-26 20:48:46 +08:00 via iPhone
    C 中字符串以 0 表示结束
    b00tyhunt3r
        3
    b00tyhunt3r  
    OP
       2019-09-26 20:52:33 +08:00 via iPhone
    哎?那是说*p=0 等价于 *p = ‘/0’ 吗?
    Oz2011
        4
    Oz2011  
       2019-09-26 20:53:21 +08:00
    哈哈,为什么打到 e 就停止了呢,后面的内存里也有数据啊,为什么 printf 不一次性把他们都打出来
    wevsty
        5
    wevsty  
       2019-09-26 20:54:04 +08:00
    @b00tyhunt3r
    是的 '/0'就是数字 0
    keyv
        6
    keyv  
       2019-09-26 20:56:41 +08:00 via iPhone
    0 在 ascii 表示空字符,即字符串的结束符
    Thoxvi
        7
    Thoxvi  
       2019-09-26 21:02:13 +08:00 via Android
    更正一下 '\0',
    然后同一楼
    thinkIn
        8
    thinkIn  
       2019-09-26 21:05:33 +08:00 via iPhone
    @Oz2011 #4 看一下 printf 的格式控制符
    philon
        9
    philon  
       2019-09-26 21:11:31 +08:00
    1. 静态字符串的长度是 5,但内存空间要给到 6,因为末尾有个你看不到的'\0'
    2. *p=0 仅仅是赋值,不是什么释放
    3. 我其实也是想吐槽下的,但是从你的代码上可以看出你可能还是个大一新生,还是鼓励下你👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:03 · PVG 03:03 · LAX 11:03 · JFK 14:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.