我在自己的 substr 函数中遇到内存泄漏错误

I'm getting a memory leak error in my own substr function

char *ft_substr(char const *s, unsigned int start, size_t len)
{
    size_t  i;
    size_t  d;
    char    *subs;

    i = 0;
    d = 0;
    subs = (char *)malloc(sizeof(char) * (len + 1));

    if (!subs || !s)
    {
        return NULL;
    }

    while (s[i])
    {
        if (i >= start && d < len)
        {
            subs[d] = s[i];
            d++;
        }

        i++;
    }

    subs[d] = '[=10=]';
    return subs;
}

上面出现的代码是我写的substr函数,当我使用Memd检查内存泄漏时,我发现第14行有错误

subs = (char *)malloc(sizeof(char) * (len + 1));

不幸的是,我没有权限在我使用的设备上安装 Valgrind,所以我可以用 memd 进行测试。我是 C 语言的新手,您能解释一下为什么我会遇到内存泄漏错误以及如何修复它吗?

subs = (char *)malloc(sizeof(char) * (len + 1));
if (!subs || !s)
{
    return (NULL);
}

我if语句的sub-statement会在s等于NULL的时候拿到控制权,这时会出现内存泄露

注意,您可以像所有C标准字符串函数一样,去掉检查s是否为空指针。如果用户将调用传递空指针的函数,则会出现未定义的行为。

并且 malloc 的调用可以分配比需要更多的内存。

还有第二个和第三个参数的类型不一致

char    *ft_substr(char const *s, unsigned int start, size_t len)

两者都应具有类型 size_t

解决这个问题的关键是在你的函数的开头添加一个守卫,在你分配给 subs 之前,它可能永远不会是 returned,因此无法被释放。

if (!s) return NULL;

您仍然可以稍后检查 subs 何时分配,如果分配失败 return NULL

如果你想让它安全,你不仅需要检查 s 是否不为 NULL,而且还需要检查开始是否超过字符串的长度。

尝试只从函数中获得一个 return 点,而不是使用肯定检查(即,如果某些东西有效,而不是检查它是否无效)。

char *ft_substr(char const * restrict s, const size_t start, const size_t length)
{
    char  *subs = NULL;

    if(s)
    {
        size_t len = strlen(s);
        if(len >= start)
        {
            subs = malloc(length + 1);
            if(subs)
            {
                char *wrk = subs;
                size_t tocopy = length;
                s += start;
                while(tocopy-- && (*wrk++ = *s++));
                *wrk = 0;
            }
        }
    }
    return subs;
}