实现中缀到后缀,反之亦然算法
我找到了,
char * str = (char*) malloc(1);
strcpy(str,str2);
即使str2
超过1个字符(20个字符或更多),这也有效。
我没有收到任何警告或运行时错误。
这怎么可能?
注意:
我也没有得到垃圾。
无论str2
如何,我总是得到必需的结果。
答案 0 :(得分:7)
这可行的原因是C取消了内存访问权限。 strcpy / strcat没有IDEA你给它们的指针的另一端有多少内存。他们只是假设你知道自己在做什么,然后去做。
至于为什么你没有看到问题:好吧,他们写进了那段记忆。没有什么可以阻止他们写出超出你分配的内容,所以他们这样做了。所以当你稍后再看时,它很好。发生什么了?他们写了别的东西!
他们可能会写下已经分配的其他内容,可能是他们在未分配的空间上写的,可能是你很幸运,他们写了一些无关紧要的东西。
他们可能会在内部结构上写下来,一段时间之后你会让malloc崩溃。
如果你知道你已经以某种方式分配了足够的缓冲区,那么使用这些函数是可以的,但在大多数情况下(特别是如果被复制的东西来自用户),你会想看看strncpy。但要小心,一个人有一些其他的陷阱,为不警惕。
答案 1 :(得分:2)
这就是为什么不建议使用strcat
和strcpy
函数的原因。最好使用strncat
和strncpy
。但是在使用之前他们还需要一些注意事项,因为strncpy
and strncat
is also not safer to use。