簡體   English   中英

C在釋放內存時,將double類型的變量強制轉換為char類型的變量

[英]C Casting a variable of type double to a variable of type char when freeing memory

在處理庫時,在提供的示例源代碼中我找到了以下代碼:

x     = (double *) malloc (narcs  * sizeof (double));
dj    = (double *) malloc (narcs  * sizeof (double));
pi    = (double *) malloc (nnodes * sizeof (double));
slack = (double *) malloc (nnodes * sizeof (double));

我在這里找不到什么特別的東西,但在釋放內存時,源代碼示例執行以下操作:

free_and_null ((char **) &x);
free_and_null ((char **) &dj);
free_and_null ((char **) &pi);
free_and_null ((char **) &slack);

free_and_null代碼是:

static void
free_and_null (char **ptr)
{
    if ( *ptr != NULL ) {
    free (*ptr);
    *ptr = NULL;
    };
};

我的問題不是為什么,當釋放先前分配的內存時,它會對char雙指針進行轉換。 我的問題是為什么這樣做是這樣的,使用自定義函數釋放內存以及為什么選擇char **作為此函數的參數。

我知道當然這個問題正在發生,因為我對C語言的知識仍然有限,但無論如何,任何人都可以解釋為什么這樣做,如果這是一個好習慣。

我必須同意你的看法 - 代碼有點奇怪。 作者沒有理由不能輕易地使用void **

另外, if (*ptr != NULL)檢查是不必要的,因為free(NULL)是完全合法的。 ; 大括號后的字符也不是必需的。

更簡單的版本可能如下所示:

static void free_and_null(void **ptr)
{
    free(*ptr);
    *ptr = NULL;
}

這個函數存在的原因是確保釋放的指針設置為NULL ,這有助於檢測釋放后使用的錯誤並完全避免雙重錯誤。

編輯:正如StarPilot在下面建議的那樣,檢查ptr本身不是NULL可能是個好主意:

static void free_and_null(void **ptr)
{
    if (ptr)
    {
        free(*ptr);
        *ptr = NULL;
    }
}

額外級別的間接( ** )的原因是因為這允許free_and_null的作者將指針設置為NULL。 如果它們只是傳遞*或x,則它們將具有通過值傳遞的指針的副本。

static void
free_and_null (char *ptr)
{
    if ( ptr != NULL ) {
    free (ptr);
//    *ptr = NULL; CAN'T DO THIS NOW
    };
};

在釋放已分配的內存后將指針重置為NULL並不是一個壞主意,因為它可以幫助檢測內存泄漏。 我不會完全遵循上面作者的風格,但我認為這可以幫助你理解基本原理。 正如卡爾指出的那樣, void **將是一個更合適的簽名。 你經常看到人們使用char*作為“通用”類型的指針類型的C代碼 - 這是錯誤的,沒有充分的理由在這種情況下使用char。

避免指向指針的另一種方法就是:

void *free_and_null_back(void *p) {
    free(p);
    return NULL;
    }

用法:

p = free_and_null(p);

或者,對於#define粉絲:

#define free(p) free(p);(p)=null;

顯然,它伴隨着關於#define危險的所有常見警告......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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