1

我有一些代码:

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 中释放内存,而不添加临时变量吗?例如:

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

4 回答 4

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传递元素的缓冲区。

于 2012-11-05T12:14:22.917 回答
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));
于 2012-11-05T11:37:01.713 回答
0

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

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

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

笔记:

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

于 2012-11-05T11:46:14.103 回答
0

几个问题:

您的itoa函数意外编译。指向数组的指针与指向 的指针char是不同的类型char,这会引发警告,但实际上您返回*t的是t. 假设它t的类型为“指向 16 元素数组的指针char”,则表达式*t的类型为“16 元素数组char”。除非它是、 或 一元运算符的操作数sizeof,或者是用于在声明中初始化另一个数组的字符串文字,否则“N-element array of ”类型的表达式将被转换(“decay”)为“指针”类型的表达式_Alignof&TT",它的值将是数组的第一个元素的地址。所以你偶然返回了正确的类型。

您不需要转换结果malloc(至少从 C89 开始)。这是一个典型的malloc调用模板:

T *p = malloc(N * sizeof *p);

其中是您分配N的类型元素的数量。T所以你可以把你的电话改写为

char *t = malloc(16 * sizeof *t);

虽然在这种特殊情况下sizeof是多余的,因为sizeof char== 1。那么你的其余代码将是

sprintf(t, "%d", a);
return t;

然后在稍后的某个时候,您将调用free您的实现返回的值itoa。虽然坦率地说,如果您使用 C99 或更高版本的编译器,Jens Gustedt 的解决方案会更好。

于 2012-11-05T13:53:57.973 回答