我编写了错误的代码段,只有在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);
答案 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
是否没有失败,但由于这只是较大代码的示例,因此不清楚这是真正的问题还是只是遗漏了代码。