我们都知道,"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]='\0';
9 printf("%s\n",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 '\0'
(gdb) p p[16]
$3 = 0 '\0'
(gdb) p p[17]
$4 = 0 '\0'
(gdb) p p[18]
$5 = 0 '\0'
(gdb) p p[20]
$6 = 0 '\0'
(gdb) p p[21]
$7 = 0 '\0'
(gdb) p p[22]
$8 = 0 '\0'
(gdb)
经过类似的多个操作的证实,通常未经使用的内存ascii值都为
也就是都还是00000000(每个位都是0)。。。。。所以就可以理解为什么没有设置'\0'也可以输出”zhongxiaoming“了。不过,不是所有的都能这样子,如果p[14]!='\0'.这就造成了挎内存访问了。。。
我们可以做个小实验验证一下。
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]='\0';
11 printf("%s\n",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\n",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开始查找,一直遇到'\0',才算是把这些内容当做一个字符串输出。
不会单纯的输出“zhongxiaoming”那么简单了。
其实这些处理很多时候会用在对文件的一些操作上,比如想要识别某些特殊符号的串时,可以用'\0'进行暂时的标记处理。