C 我不能对函数返回的字符指针使用free()

C 我不能对函数返回的字符指针使用free(),c,memory,C,Memory,我无法清除在ft\u itoa\u base()函数中分配的str变量。 错误未分配要释放的指针 void work_ptr_accuracy(t_args *args, char **return_str, \ va_list *arg) { int size_accuracy; char *str_tmp; char

我无法清除在
ft\u itoa\u base()
函数中分配的
str
变量。 错误
未分配要释放的指针

void            work_ptr_accuracy(t_args *args, char **return_str, \
        va_list *arg)
{
    int                     size_accuracy;
    char                    *str_tmp;
    char                    *str;
    unsigned long long int  n;

    str_tmp = NULL;
    str = NULL;
    if (args->accuracy != -1)
    {
        size_accuracy = args->accuracy;
        n = va_arg(*arg, unsigned long long int);
        str = ft_itoa_base(n, 16, LOWERCASE);
        *return_str = ft_substr(str, 0, size_accuracy);
        free(str);
        str_tmp = ft_strjoin("0x", *return_str);
        free(*return_str);
        *return_str = str_tmp;
    }
}
这是
ft\u itoa\u base()


ft\u itoa\u底座设计不良
<代码>返回(“0”)返回指向静态分配数组的指针,该数组由两个字符组成(“0”和“\0”)。那个不能是免费的

通过以下方式与此实现进行比较:

#包括
#包括
内部固定支架(内部固定支架)
{
if(nb<0)
nb=-nb;
回报率(nb);
}
字符*ft_itoa_基(int值,int基)
{
char*str;
整数大小;
字符*选项卡;
int标志;
int tmp;
flag=0;
尺寸=0;
tab=“0123456789ABCDEF”;
如果(基底<2 | |基底>16)
返回(0);
if(值<0&&base==10)
flag=1;
tmp=数值;
while(tmp/=base)
大小++;
大小=大小+标志+1;
str=(char*)malloc(sizeof(char)*size+1);
str[size]='\0';
如果(标志==1)
str[0]='-';
while(大小>标志)
{
str[size-1]=制表符[ft_abs(值百分比基)];
大小--;
值/=基数;
}
返回(str);
}

我不知道
ft\u iota\u base
是做什么的,但是你有没有阅读文档,看看你是否应该使用
免费
?基于这个错误,我猜你必须用其他方法来清理它。所以。。。当大多数/许多函数返回指向某个对象的指针时,请不要使用
malloc
,这不是必需的。有些函数返回一个指向静态/全局变量的指针[您无法释放它--正如您发现的那样]。例如:
localtime
返回指向静态/全局区域的指针。如果[我重复一下:如果]分配了值,那么获得此错误的唯一方法将是某种形式的堆损坏,在这里,这必须通过
ft\u substr
来完成。由于您没有发布
ft\u substr
的源代码,我假设它是一个标准库函数。如果没有,发布所有的
ft.*
函数。根据“Swift-TL;DR”:-”找到的内容,您可能应该执行(例如,
If(value==0)返回NULL
@CraigEstey我想我的想法是,
ft_itoa_base
永远不应该返回空指针,释放一个指针是安全的,但使用一个指针则不会,整数总是可以转换为字符串表示。找到的代码可能会修改为sue,任何基都不超过“Z”:P@Swift-星期五派是的,我想在之前的评论中补充这一点,但没有空间这么做。在我添加第二条评论之前,您的答案出现了,代码示例涵盖了这一点,因此[问题解决后],我认为没有必要重复同样的内容。
char        *ft_itoa_base(unsigned long long int value, \
        unsigned long long int base, int regist)
{
    int                     len;
    unsigned long long int  digit;
    char                    *return_str;
    char                    *base_tmp;

    base_tmp = get_register(regist);
    if (value == 0)
        return ("0");
    len = 0;
    digit = value;
    ft_baselen(digit, base, &len);  
    if (!(return_str = (char *)malloc(sizeof(char) * (len + 1))))
        return (NULL);
    return_str[len] = '\0';
    while (digit)
    {
        return_str[--len] = base_tmp[digit % base];
        digit /= base;
    }
    if (value < 0 && base == 10)
        return_str[0] = '-';
    return (return_str);
}
/*
** Function:        char *ft_substr
**
** Description:     Allocates (with malloc(3)) and returns a substring
** from the string ’s’.
** The substring begins at index ’start’ and is of
** maximum size ’len’.
*/

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

    i = 0;
    j = 0;
    if (!s)
        return (NULL);
    if (start >= ft_strlen(s))
    {
        if (!(str = (char *)malloc(1)))
            return (NULL);
        str[0] = '\0';
        return (str);
    }
    while (s[i] != s[start])
        i++;
    if (!(str = (char *)malloc((len * sizeof(char)) + 1)))
        return (NULL);
    while (j < len && s[i])
        str[j++] = s[i++];
    str[j] = '\0';
    return (str);
}
#include <stdlib.h>
#include <stdio.h>

int     ft_abs(int nb)
{
    if (nb < 0)
        nb = -nb;
    return (nb);
}

char    *ft_itoa_base(int value, int base)
{
    char    *str;
    int     size;
    char    *tab;
    int     flag;
    int     tmp;
    flag = 0;
    size = 0;
    tab = "0123456789ABCDEF";
    if (base < 2 || base > 16)
        return (0);
    if (value < 0 && base == 10)
        flag = 1;
    tmp = value;
    while (tmp /= base)
        size++;
    size = size + flag + 1;
    str = (char *)malloc(sizeof(char) * size  + 1);
    str[size] = '\0';
    if (flag == 1)
        str[0] = '-';
    while (size > flag)
    {
        str[size - 1] = tab[ft_abs(value % base)];
        size--;
        value /=base;
    }
    return (str);
}