[英]Free memory after 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釋放內存嗎? 例如:
temp=itoa(i);
mvwprintw(my_menu_win,i+1,2,temp);
free(temp);
您不應該將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
元素的緩沖區。
簡而言之:不。
要釋放分配的內存,您需要對其進行引用。
如果您可以更改轉換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));
另一種方法是在函數中分配一個靜態數組,這樣就完全不必釋放它:
const char* itoa(int a)
{
static char t[16];
sprintf(t,"%d",a);
return t;
}
mvwprintw(my_menu_win,i+1,2,itoa(i));
注意:
這種方式不是線程安全的,並且不能多次用作函數的參數。
幾個問題:
您的itoa
函數是意外編譯的。 指向char
數組的指針與指向char
的指針的類型不同,這將引發警告,但實際上您將返回*t
而不是t
。 假設t
類型為“指向char
16元素數組的指針”,則表達式*t
類型為“ char
16元素數組”。 除非它是sizeof
, _Alignof
或一元&
運算符的操作數,或者是用於在聲明中初始化另一個數組的字符串文字,否則將轉換類型為“ T
N元素數組”的表達式(“ decay” “)指向類型為” pointer to T
“的表達式,其值將為數組第一個元素的地址。 因此,您偶然返回了正確的類型。
您不需要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的解決方案會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.