C语言中strcpy()的问题?

图片描述

刚接触C语言,代码和执行结果如图。
疑问:
1.b 定义的长度是3,为什么可以放"helloworld"这样长度大于3的字符串?
2.为什么a会少了前面3个字符?

回答:

在内存中两个数组的内存分配应该是这样的:
'?' '?' '?' 'h' 'e' 'l' 'l' 'o' 'w' 'o' 'r' 'l' 'd' '\0' (数组b没有初始化所以内容是不确定的)
strcpy不知道这个字符数组a有多长,只知道一段字符串遇到'\0'就算结束,于是把a全部复制到b了:
'h' 'e' 'l' 'l' 'o' 'w' 'o' 'r' 'l' 'd' '\0' 'l' 'd' '\0'

c语言有个观点(哲学?):程序员知道自己正在做什么。于是c中有些地方就没有做安全性检查了。然而后来发现,许多程序员并不清楚自己在做什么,于是就有了strcpy_s。

补充下,两个数组的位置是由编译器决定的。比如我用gcc编译的结果是,a、b数组都为helloworld。

回答:

  1. 内存溢出了,strcpy 不管你 b 的长度的,请用 strncpy 和 sizeof;

  2. 内存分配的是这样 bbbaaaaaaaaaaa ;你的 b 溢出了,把 a 覆盖了。就是你这个效果了。

回答:

楼上两位已经很准确了。我补充一下,如果你不明白他们在说什么,那么我建议你搞清楚C语言的内存分配机制,包括什么是栈(Stack),什么是堆(Heap),什么情况下是在栈上分配的,什么情况下是在堆上分配的。你的代码是在栈上分配的。正如2楼说的:c语言有个观点(哲学?):程序员知道自己正在做什么

以上是 C语言中strcpy()的问题? 的全部内容, 来源链接: utcz.com/p/195076.html

回到顶部