gpt4 book ai didi

c - 未能释放字符指针内存 c

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

我有一个问题。我正在为 char* 分配空间,但是当我试图释放 空间时,我的程序崩溃了。

这是代码

fullPath = (char *) malloc(strlen(path) + strlen(fileData->d_name) + 1);
if (fullPath == NULL)
{
handleErrors(ERR_ALOCATION_CODE);
}
sprintf(fullPath, "%s/%s", path, fileData->d_name);
//... some more code, I only use fullPath, I don't change it here
free(fullPath);

上面的代码在尝试free 时失败。我将不胜感激。

最佳答案

您没有为终止 NUL 字符的字符串分配空间。所以改变分配给这个:

// allocate memory for 1st part, slash, 2nd part and terminating NUL char
fullPath = malloc(strlen(path) + 1 + strlen(fileData->d_name) + 1);

另请注意,在 C 中强制转换 malloc 的返回值是不好的做法,因此我删除了它。


使用 snprintf 可能是一种改进,以防你计算的长度错误,尽管在这种情况下可能是一个意见问题。无论如何,那么代码将变为

// size for 1st part, slash, 2nd part and terminating NUL char
size_t bufsize = strlen(path) + 1 + strlen(fileData->d_name) + 1;
fullPath = malloc(bufsize);
//...
snprintf(fullPath, bufsize, "%s/%s", path, fileData->d_name);

然后一个错误将不会导致未定义的行为,而是生成从末尾切掉的字符的路径。这是比随机崩溃更好的错误情况(例如文件未找到错误),更不用说更容易调试,当您可以打印文件名并查看它是如何不正确时。


一些解释:在问题代码中,因为您分配的1个字节太少,导致缓冲区溢出,这是未定义的行为,所以基本上任何事情都可能发生。对于 1 字节缓冲区溢出,很可能不会发生任何坏事,因为在分配结束时可能有未使用的字节。所以在某种程度上,你真的很幸运能这么早捕获它。你可以想象找到一个 bug 是多么困难,当程序仅在字符串长度恰好是 16 的倍数时崩溃,否则就可以工作......幸运的是有检测这样的东西的工具,但最好的防御是成为一个迂腐的 C 程序员,谁努力写出好的代码...

关于c - 未能释放字符指针内存 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39004628/

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