malloc之后的空闲内存

时间:2012-11-05 11:26:20

标签: c malloc

我有一些代码:

char * itoa(int a)
{
    char (*t)[16]=(char(*)[16])malloc(1*sizeof(char[16]));
    sprintf(*t,"%d",a);
    return *t;
}
// ...
mvwprintw(my_menu_win,i+1,2,itoa(i));

我可以从malloc中释放内存,而无需添加临时变量吗? e.g:

temp=itoa(i);
mvwprintw(my_menu_win,i+1,2,temp);
free(temp);

4 个答案:

答案 0 :(得分:4)

您不应该将malloc用于您知道范围受限制的缓冲区。

对于您可能希望保留缓冲区一段时间的情况的一个很好的解决方案是从C99开始的复合文字。我会选择像

这样的东西
char const* itoa(int a, char (*buffer)[16]) {
    sprintf(*buffer,"%d",a);
    return *buffer;
}

#define ITOA(A) itoa((A), &(char[16]){ 0 })

指向函数数组的指针确保传递16元素的缓冲区。

答案 1 :(得分:3)

简而言之:否。

要释放已分配的内存,您需要引用它。

如果您可以更改转换API,可能的解决方法是使用外部提供的缓冲区:

char * itoa(char * t, int i)
{
  sprintf(t,"%d",a);
  return t;
}

以这种方式拨打itoa()

{
  char buffer [16];

  mvwprintw(my_menu_win,i+1,2,itoa(buffer, i));
}

或者(仅限C99)可以通过这种方式调用itoa()

mvwprintw(my_menu_win,i+1,2,itoa((char[16]){0}, i));

所以要清理这个宏有帮助:

#define ITOA_0(i) itoa((char[16]){0}, i) /* init array with 0s */
#define ITOA(i) itoa((char[16]){}, i) /* do not init array with 0s -> faster, but none ISO */

...

mvwprintw(my_menu_win,i+1,2,ITOA(i));

答案 2 :(得分:0)

另一种方法是在函数中分配一个 static 数组,这样你就不必释放它了:

const char* itoa(int a)
{
    static char t[16];
    sprintf(t,"%d",a);
    return t;
}

mvwprintw(my_menu_win,i+1,2,itoa(i));

注意:

这种方式不是线程安全的,不能多次用作函数的参数。

答案 3 :(得分:0)

几个问题:

您的itoa函数意外编译。指向char数组的指针与指向char的指针的类型不同,这会引发警告,但事实上您将返回*t而不是{t 1}}。鉴于t具有类型"指向{-1}}"的16个元素数组的指针,表达式char具有类型" 16个元素的数组{{ 1}}&#34 ;.除非它是*tchar或一元sizeof运算符的操作数,或者是用于初始化声明中的另一个数组的字符串文字,是&#type的表达式34; _Alignof"的N元素数组;将被转换("衰减")到类型为#34的表达式;指向&"的指针,其值将是数组的第一个元素的地址。因此,您意外地返回了正确的类型。

您不需要投射T的结果(至少从C89开始)。这是T电话的典型模板:

malloc

其中malloc是您要分配的T *p = malloc(N * sizeof *p); 类型元素的数量。所以你可以把你的电话重写为

N

虽然在这种特殊情况下,T是多余的,因为char *t = malloc(16 * sizeof *t); == 1.然后其余的代码将是

sizeof

然后在稍后的某个时刻,您会对sizeof char的实施所返回的值调用sprintf(t, "%d", a); return t; 。虽然坦率地说,如果您使用的是C99或更高版本的编译器,Jens Gustedt的解决方案会更好。