簡體   English   中英

malloc之后的可用內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM