即使没有分配足够的内存,strcat()和strcpy()仍然有效

Abh*_*hau 3 c

实现中缀到后缀,反之亦然算法

我发现,

char * str = (char*) malloc(1);
strcpy(str,str2);
Run Code Online (Sandbox Code Playgroud)

即使str2超过1个字符(20个字符或更多),这也可以工作.

我没有得到任何警告或运行时错误.

这怎么可能?

注意:

我也没有得到垃圾.

无论如何,我总是得到所需的结果str2.

Mic*_*hne 7

这有效的原因是C取消了内存访问权限.strcpy/strcat没有IDEA你给它们的指针的另一端有多少内存.他们只是假设你知道自己在做什么,然后去做.

至于为什么你没有看到问题:嗯,他们写入了那段记忆.没有什么可以阻止他们写出超出你分配的内容,所以他们这样做了.所以当你稍后再看时,它很好.发生什么了?他们写了别的东西!

他们可能会写一些已经分配过的东西,可能是他们在未分配的空间上写的,可能是你很幸运,他们写了一些无关紧要的东西.

他们可能会在内部结构上写下来,一段时间之后你会让malloc崩溃.

如果你知道你已经以某种方式分配了足够的缓冲区,那么使用这些函数是可以的,但在大多数情况下(特别是如果被复制的东西来自用户),你会想看看strncpy.但要小心,一个人有一些其他陷阱为粗心大意.

  • 即使`strncpy()`并不总是按照人们的想法去做.E. g.如果字符串长于大小,它会跳过终止的`\ 0`. (4认同)