c - 即使没有分配足够的内存,strcat() 和 strcpy() 也能工作

标签 c

<分区>

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

我发现,

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

即使 str2 超过 1 个字符(20 个字符或更多)也能正常工作。

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

这怎么可能?

注意:

我也没有得到垃圾。

无论 str2 是什么,我总是能得到所需的结果。

最佳答案

之所以可行,是因为 C 具有未经检查的内存访问。 strcpy/strcat 不知道你给它们的指针的另一端有多少内存。他们只是假设您知道自己在做什么,然后去做。

至于为什么你没有发现问题:好吧,他们写入了那个内存。没有什么能阻止他们写超出你分配的内容,所以他们这样做了。所以以后再看的时候就好了。发生什么了?他们改写了别的东西!

可能是他们覆盖了已经分配的其他东西,可能是他们覆盖了未分配的空间,可能是你很幸运,他们覆盖了一些无关紧要的东西。

可能是他们覆盖了内部结构,一段时间后您会遇到 malloc 崩溃。

如果您知道您已经以某种方式分配了足够的缓冲区,则可以使用这些函数,但在大多数情况下(尤其是如果被复制的内容来自用户),您将需要查看 strncpy。但要小心,粗心大意的人可能会遇到其他一些陷阱。

关于c - 即使没有分配足够的内存,strcat() 和 strcpy() 也能工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21800187/

相关文章:

c - 堆栈内存使用连续动态分配的数组与静态

c - realloc 只是扩展内存还是可能导致内存问题?

c++ - Windows 上的堆栈 - 它在哪里?

c - 当我给 printf 一个指向 char 数组的指针时程序崩溃

c - 如何在 C 中创建一个包含 100 个随机字符串的数组

c++ - 他们实现的开源 C 编译器(gcc、clang)的实际标准在哪里?

c - 这个缓冲区怎么会溢出?

c - 具有灵活数组成员的返回结构

c - 在#define 方面需要一些帮助

c - 如何连接结构节点(链表)?