复制字符串所需空间的疑惑

C++语言 码拜 9年前 (2016-06-06) 1091次浏览
对于char s4[  ]=”hello world”它的字符串长度是11.加上”\0″,
s5 [ 5 ] 应该为s5[ 12 ]才能保存s[4]的数据,为什么输出s5仍然是 hello world
而且复制数据后输出strlen(s4)为3?

char s4[] = "hello world" ;
char s5[5] ;
cout<<strlen(s4)<<"  "<<strlen(s5)<<endl ;
cout<<sizeof(s4)<<"  "<<sizeof(s5)<<endl ;
strcpy(s5,s4) ;
cout<<strlen(s4)<<"  "<<strlen(s5)<<endl ;
cout<<s5<<endl ;

输出为
11 19
12 5
3 11

解决方案

5

开始s5和s4的地址如下:
????????hello world\0
strcpy后变成这样:
hello world\0o world\0
推理方法:
栈上的数据都是连续的,所以s5,s4地址一个先一个后,但相隔不太远,又原因是strcpy后,s4被改,所以s5在前,s4在后.又原因是strcpy后s4长度是3, 所以s5 + s5到s4的距离是8, 所以得到上面的结果.
至于s5和s4中间的3字节, 有两种可能: 一种是你在函数中还定义了其它3字节的局部变量, 另一种是你机器字长为8,默认被对齐地址了

15

C语言标准库函数strcpy,把从src地址开始且含有”\0″结束符的字符串复制到以dest开始的地址空间。
以上是对strcpy函数的解释。当你使用strcpy后“hello world”字符串从s5字符串数组首地址开始存储,“rld”刚好覆盖到了s4。所以当你调用strlen的时候读取的是“rld\0”,所以只有3个。
char s4[] = “hello world” ;
char s5[5] ;
当你上面两句执行后内存是这样的: CC CC CC CC CC CC CC CC  烫烫烫烫
68   65  6C 6C  6F  20  77  6F  hello wo
72   6C 64  00                             rld(后面有个’\0‘)
当你执行了strcpy(s5,s4) ;后:           68   65  6C 6C  6F  20  77  6F  hello wo
72   6C 64  00  6F  20  77  6F  rld.o wo
72   6C 64  00  C0  FF 12  00  rld
还懂点的解释是:X   X   X   X   X   X   X   X   h   e   l   l   o   空   w   o   r   l   d   \0

[–s5–]    [–s4–]
h   e    l    l   0   空  w   o   r    l   d  \0

[–s5–]
[–s4–]

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明复制字符串所需空间的疑惑
喜欢 (0)
[1034331897@qq.com]
分享 (0)