expected 'void **' but argument is of type 'char **'
だから私は次のように調整した:
#include <stdio.h>
#include <stdlib.h>
void myfree(void *x)
{
void **v = x;
if(!v || !*v)
return;
free(*v);
*v = NULL;
return;
}
int main(int argc, char *argv[])
{
char *test;
if((test = malloc(1)))
{
printf("before: %p\n", test);
myfree(&test);
printf("after: %p\n", test);
}
return 0;
}
これは法的なCですか?私はvoidポインタを逆参照していますか?
ありがとう
EDIT 12/10/2010 4:45 PM EST:
free(NULL)
は安全でC規格の対象であることが指摘されています。また、以下に述べるように、上記の私の例は合法ではありません。カフェの答え、ザックの答え、自分の答えを見てください。
それゆえ、mallocされたポインターをNULLとして初期化し、後でfree()とNULLをコードに直接書き出すほうが簡単になります:
free(pointer);
pointer = NULL;
私が行ったようにmyfree()でNULLをチェックしていた理由は、fclose()での私の経験のためでした。 fclose(NULL)
はプラットフォーム(例えばxpsp3 msvcrt.dll 7.0.2600.5512など)によってsegfaultすることができるので、私は(間違って)同じことがfree()で起こる可能性があると想定していました。私は関数内でよりよく実装できるif文を使って自分のコードを混乱させるよりもむしろわかっていました。
良いお話をいただき、ありがとうございます。
(x)は、(x)の自由{行う一部は異教徒私を呼び出しますが、私はちょうどがmyfreeを定義し '使用します。 x = NULL} while(0) ' –
あなたは 'voidへのポインタ'を逆参照していません。あなたは完全に合法である 'voidへのポインタへのポインタ'を逆参照しています。 – aschepler
実際には、以前のマクロを修正したいと思います: '#define myfree(x)do {void ** tmp_ =&x;無料(* tmp_); * tmp_ = NULL; } while(0) '(私は' x'の二重評価を避ける方法はないと思ったが、そこにある!) –