zoukankan      html  css  js  c++  java
  • 没有''结尾的字符串输出(0)

    我们都知道,"zhongxiaoming",这里有14个字符,我们把它拷到14个连续内存里,然后输出,看看能不能成功。

    我们先验证一下:

    1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 int main()
      5 {
      6         char *p=(char*)malloc(14);
      7         strcpy(p,"zhongxiaoming");
      8         p[5]='';
      9         printf("%s ",p);
     10         return 0;
     11 }

    结果:

    Love-Yan:pointertest MD101$ gcc string.c 
    Love-Yan:pointertest MD101$ ./a.out 
    zhong
    Love-Yan:pointertest MD101$ 

    验证成功。

    ===============================================

    Love-Yan:pointertest MD101$ gcc string.c 
    Love-Yan:pointertest MD101$ ./a.out 
    zhongxiaoming
    Love-Yan:pointertest MD101$ 

    it does。。。。

    但是,

    (gdb) p p
    $1 = 0x100103a10 "zhongxiaoming"
    (gdb) p p[15]
    $2 = 0 ''
    (gdb) p p[16]
    $3 = 0 ''
    (gdb) p p[17]
    $4 = 0 ''
    (gdb) p p[18]
    $5 = 0 ''
    (gdb) p p[20]
    $6 = 0 ''
    (gdb) p p[21]
    $7 = 0 ''
    (gdb) p p[22]
    $8 = 0 ''
    (gdb) 

    经过类似的多个操作的证实,通常未经使用的内存ascii值都为



    也就是都还是00000000(每个位都是0)。。。。。所以就可以理解为什么没有设置''也可以输出”zhongxiaoming“了。不过,不是所有的都能这样子,如果p[14]!=''.这就造成了挎内存访问了。。。

    我们可以做个小实验验证一下。

    1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 int main()
      5 {
      6         char c[]="ABC",a[13]="zhongxiaoming",b[]="DEF";
      7 
      8         //char *p=(char*)malloc(20);
      9 //      strcpy(p,"zhongxiaoming");
     10 //      p[5]='';
     11         printf("%s ",a);
     12         return 0;
     13 }

    Love-Yan:pointertest MD101$ gcc string.c -g
    Love-Yan:pointertest MD101$ ./a.out
    zhongxiaomingABC

    哎呀,怎么就平白无故多了ABC了?

    他不是平白无故多出来的,是有原因的。。。

    ================================================

    变量c、a、b在栈中是递减分配内存的。由下可知:


    6		char c[]="ABC",a[13]="zhongxiaoming",b[]="DEF";
    (gdb) s
    11		printf("%s
    ",a);
    (gdb) p c
    $1 = "ABC"
    (gdb) p sizeof(c)
    $2 = 4
    (gdb) p &c
    $3 = (char (*)[4]) 0x7fff5fbffbac
    (gdb) p sizeof(a)
    $4 = 13
    (gdb) p &a       
    $5 = (char (*)[13]) 0x7fff5fbffb9f
    (gdb) p &b
    $6 = (char (*)[4]) 0x7fff5fbffb9b
    (gdb) 


    所以输出a字符串就没有那么幸运了,系统会从 0x7fff5fbffb9f开始查找,一直遇到'',才算是把这些内容当做一个字符串输出。

    不会单纯的输出“zhongxiaoming”那么简单了。

    其实这些处理很多时候会用在对文件的一些操作上,比如想要识别某些特殊符号的串时,可以用''进行暂时的标记处理。





  • 相关阅读:
    使用jvisualvm和飞行记录器分析Java程序cpu占用率过高
    Callable、Future和FutureTask
    CountDownLatch(闭锁)
    ArrayBlockingQueue和LinkedBlockingQueue分析
    并发容器之CopyOnWriteArrayList(转载)
    svn 文件夹 无法提交
    rsync 不能同不子级目录的问题
    nginx 匹配.zip .apk 结尾的文件 直接下载
    Android文件Apk下载变ZIP压缩包解决方案
    nginx: [warn] conflicting server name "locahost" on 0.0.0.0:80, ignored
  • 原文地址:https://www.cnblogs.com/iosDevZhong/p/4395240.html
Copyright © 2011-2022 走看看