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

时间:2014-02-15 16:19:05

标签: c

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

我找到了,

char * str = (char*) malloc(1);
strcpy(str,str2);

即使str2超过1个字符(20个字符或更多),这也有效。

我没有收到任何警告或运行时错误。

这怎么可能?

注意:

我也没有得到垃圾。

无论str2如何,我总是得到必需的结果。

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:2)

这就是为什么不建议使用strcatstrcpy函数的原因。最好使用strncatstrncpy。但是在使用之前他们还需要一些注意事项,因为strncpy and strncat is also not safer to use