1. ホーム
  2. c

[解決済み] ffmpeg の av_freep はどのように機能するのですか?

2022-02-04 07:20:32

質問内容

C言語のvoid pointerについて質問があります。ffmpegの一部で以下のようなコードがあり、理解できませんでした。どなたか、どのように動作するのか説明していただけませんか?

void av_freep(void *arg)
{
        void *val;

        memcpy(&val, arg, sizeof(val));
        memcpy(arg, &(void *){ NULL }, sizeof(val));
        av_free(val);
}

というように、後で呼び出されます。

char *str;
av_freep(&str);

私の質問です。

  1. str (&str) のアドレスを渡すと、コンパイル時に "incompatible type" という警告が出ないのはなぜですか?strの型はchar**にならないのでしょうか?
  2. memcpyのパラメータにある &(void *){ NULL } はどういう意味ですか?
  3. なぜ、割り当てられていないquot;val;を解放しようとするのですか?

ありがとうございます。

解決方法は?

<ブロッククオート

str (&str) のアドレスを渡すと、コンパイル時に "incompatible type" の警告が出ないのはなぜですか?また、&strの型はchar**にならないのでしょうか?

そうです、そして char** は暗黙のうちに void * (すべてのポインタ型は暗黙のうちに void * ).

<ブロッククオート

memcpyのパラメータの一つである &(void *){ NULL } はどういう意味ですか?

それは 複合リテラル (とはいえ void * は複合型ではない)。コンパイラは定数 void * 保持 NULL で、次に (&(void *){ NULL }) はそれへのポインタです。本質的には同等です。

static void* const temp = NULL;
memcpy(arg, &temp, sizeof(val));