我试图了解 strcpy 和 strncpy 的区别/缺点。
有人可以帮忙吗:
void main()
{
char src[] = "this is a long string";
char dest[5];
strcpy(dest,src) ;
printf("%s \n", dest);
printf("%s \n", src);
}
输出是:
this is a long string
a long string
问题:我不明白,源刺是如何修改的。根据解释,strcpy 应该继续复制直到遇到 '\0',确实如此,但是为什么“src”字符串被修改了。
请解释。
简单的答案是你有(这样strcpy()
call)做了一些超出系统规范的事情,因此理所当然地遭受未定义行为的影响。
更复杂的答案涉及检查系统上的具体内存布局,以及如何strcpy()
内部工作。它probably是这样的:
N+28 "g0PP"
N+24 "trin"
N+20 "ng s"
N+16 "a lo"
N+12 " is "
src N+08 "this"
N+04 "DPPP"
dest N+00 "DDDD"
这些信D
代表dest中的字节,字母P
是填充字节,0
字符是用作字符串终止符的 ASCII NUL 字符。
Now strcpy(dest,src)
会稍微改变内存内容(假设它正确处理重叠的内存区域):
N+28 "g0PP"
N+24 "trin"
N+20 "g0 s"
N+16 "trin"
N+12 "ng s"
src N+08 "a lo"
N+04 " is "
dest N+00 "this"
IE。尽管dest
现在“包含”完整的字符串"this is a long string"
(如果算上溢出的内存),src
现在包含一个完全不同的以 NUL 结尾的字符串"a long string"
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)