gpt4 book ai didi

c - 多次运行后 memcpy 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:13 24 4
gpt4 key购买 nike

我写了一段错误的代码,仅在 visual studio 中以 Release模式多次运行(大于 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);

最佳答案

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

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);
}

关于c - 多次运行后 memcpy 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18128277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com