memcpy在多次运行后崩溃

时间:2013-08-08 14:11:13

标签: c memcpy

我编写了错误的代码段,只有在visual studio中的多次运行(大于50)后才会崩溃。有人可以解释为什么这段代码没有更早崩溃

char *pcBuffer= "Some Text";
char *pctempBuff = NULL;

    pctempBuff = malloc(100);
    memset(pctempBuff,0,100);
    memcpy(pctempBuff,pcBuffer,100);

上述代码在多次运行后崩溃。

我将其更正为以下代码,该代码正确且不再崩溃

char *pcBuffer= "Some Text";
char *pctempBuff = NULL;

pctempBuff = malloc(strlen(pcBuffer)+1);
memset(pctempBuff,0,strlen(pcBuffer)+1);
memcpy(pctempBuff,pcBuffer,strlen(pcBuffer)+1);

2 个答案:

答案 0 :(得分:3)

初始代码中有两个错误。

malloc可能会失败,在低内存中返回NULL。如果你继续分配内存而不释放任何内存,系统最终将耗尽内存,malloc将返回NULL。你需要测试这个

pctempBuff = malloc(100);
if (pctempBuff != NULL) {
    memset(pctempBuff,0,100);
    memcpy(pctempBuff,pcBuffer,strlen(pcBuffer)+1);
}

您还要通过告诉memcpy从10字节pcBuffer的地址复制100个字节来读取您不拥有的内存。这导致未定义的行为。在许多显然成功的迭代之后崩溃将是一个可能的(如果不可能的话)实例。您的第二个示例是正确的,因为它只读取pcBuffer的内存。

由于您正在复制字符串,因此您可以使用strcpy

更清晰/轻松/安全地执行此操作
pctempBuff = malloc(100);
if (pctempBuff != NULL) {
    strcpy(pctempBuff,pcBuffer);
}

答案 1 :(得分:0)

在第一种情况下,您正在读取分配给pcBuffer的内存,这是未定义的行为,您无法预测此类程序的行为,事实上它可以在很长一段时间内表现良好并且永远不会崩溃。

这是最明显的错误,您还需要检查malloc是否没有失败,但由于这只是较大代码的示例,因此不清楚这是真正的问题还是只是遗漏了代码。