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