【问题标题】:strcpy function behaviourstrcpy 函数行为
【发布时间】:2014-12-09 01:48:38
【问题描述】:

我已经运行了以下程序:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main()
{
    char *p, *q;
    p = (char*)malloc(1);
    q = (char*)malloc(25);
    strcpy(p, "abcd");
    strcpy(q,"efgh");
    strcat(p,q);
    printf("%s",p);
    return 0;
}

我期待它会给出错误“分段错误”。而是将输出打印为:

abcdefgh

我不知道它是如何工作的,因为 p 只分配了 1 个字节,而我们正在复制一个占用更多空间的字符串。这是正确的行为吗?

OS: windows 7
Compiler: mingw C compiler

【问题讨论】:

  • 这叫做未定义行为...
  • 如果字符串较长,它确实会崩溃。
  • 写入数组的边界不一定会导致分段错误。很多事情都可能发生,这就是为什么它是未定义的行为。可能您的malloc 导致一个足够大的块包含"abcd" 加上终止零,这就是它起作用的原因。但这不能保证。如上所述,这是未定义的行为。
  • @Jongware:不一定。它可能会导致堆损坏,但如果初始堆足够大,则不必崩溃。通常,写入属于进程的内存不会导致崩溃,只会导致损坏。
  • @Rudy:你可能是对的。不幸的是,我弹出了那个毫无价值的 Windows“正在检查解决方案..”对话框,它没有说明确切的错误是什么......(它似乎也永远find解决方案。)跨度>

标签: c segmentation-fault strcpy


【解决方案1】:

当你使用 malloc 分配 1 个字节的内存时,malloc 实际上所做的是它从内核请求大约 134k 字节的内存并将 1 个字节分配给变量并保持剩余作为将来使用的储备,这样当下次你会做一个 malloc ,你将从储备中获得地址。并且保留中的所有地址都是有效的,因此您不会遇到任何段错误。 如果你检查 p 和 q 的地址,你就会明白为什么会这样打印。

【讨论】:

  • 它的实际作用取决于平台、使用的内存管理器等。您所描述的或类似的东西可能就是这里发生的事情,但这只是未定义的行为。段错误只是可能的后果之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2011-09-03
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多