3

ライブラリを扱っているときに、提供されたサンプル ソース コードで次のコードを見つけました。

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 double ポインターへのキャストが行われる理由ではありません。私の質問は、カスタム関数を使用してメモリを解放し、なぜchar **この関数の引数として選択されたのかということです。

C言語の知識がまだ限られているためにこの質問が発生していることは確かですが、とにかく、なぜこれが行われるのか、そしてこれが良い習慣であるかどうかを誰かが説明できますか.

4

3 に答える 3

0

ポインターへのポインターを回避する別のアプローチは、次のようになります。

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 の危険性に関する通常の警告がすべて付属しています ...

于 2013-06-13T10:40:37.643 に答える