gpt4 book ai didi

c - 未分配被释放的指针(仅限 osx)

转载 作者:太空宇宙 更新时间:2023-11-04 06:06:57 25 4
gpt4 key购买 nike

下面的函数基本上模拟了 mkdir -p,递归地为给定的路径创建目录。使用 Linux 我没有任何问题,但是在 OSX 下运行它总是出现段错误,并在调用 free(dir) 期间出现错误 pointer being freed was not allocated。谁能发现错误?当我在 gdb 中逐步执行时,我没有看到任何明显的问题,dir 被填充并且目录结构创建时没有错误。

static int
mkpath(const char *path)
{
int result = 0;
struct stat st;
char *p = NULL, *dir = strdup(path);
char *tmp = g_malloc0(sizeof(char) * strlen(cache.path) + strlen(dir) + 1);

dir = dirname(dir);
tmp = strcpy(tmp, cache.path);
p = strtok(dir, "/");
while(p != NULL) {
tmp = strncat(tmp, "/", 1);
tmp = strncat(tmp, p, strlen(p));

if(stat(tmp, &st) == 0) {
if(S_ISDIR(st.st_mode)) {
p = strtok(NULL, "/");
continue;
}

result = -ENOTDIR;
break;
}

if(mkdir(tmp, S_IRWXU) == -1) {
result = -errno;
break;
}

p = strtok(NULL, "/");
}

free(tmp);
free(dir);

return result;
}

最佳答案

查看 dirname 的手册页:http://linux.die.net/man/3/dirname . “dirname() 和 basename() 都返回指向以空字符结尾的字符串的指针。(不要将这些指针传递给 free(3)。)”此外,您可能不应该像那时那样执行 dir = dirname(dir)丢失了指向由 strdup 分配的内存的指针(strdup 分配的内存应该传递给 free)。

关于c - 未分配被释放的指针(仅限 osx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611332/

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