0

我写了一段错误的代码,只有在 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);
4

2 回答 2

3

您的初始代码中有两个错误。

malloc可能会失败,返回NULL内存不足。如果你继续分配内存而不释放任何内存,系统最终会耗尽内存并malloc返回NULL。您需要对此进行测试

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

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

由于您正在复制字符串,因此您可以通过使用更清晰/轻松/安全地执行此操作strcpy

pctempBuff = malloc(100);
if (pctempBuff != NULL) {
    strcpy(pctempBuff,pcBuffer);
}
于 2013-08-08T14:20:09.323 回答
0

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

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

于 2013-08-08T14:20:18.963 回答