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