返回类型不正确

时间:2018-03-23 23:14:21

标签: c++

定义类型:

typedef int (*vlc_media_player_is_playing(libvlc_media_player_t*));

该类定义了具有此类型的字段。该字段使用dll中的函数地址填充。当您尝试调用函数时,将返回int*指针而不是int。为什么会这样?

因此,在指针中数据是正确的。

  

当您尝试取消引用指针时,程序   崩溃。

我还要添加一个这种类型的例子:

typedef struct libvlc_instance_t libvlc_instance_t;
typedef libvlc_instance_t(*vlc_create_instance(int, const char* const*));

不知怎的,也会立刻返回一个指针。

class Foo
{
...
private:
    vlc_media_player_is_playing*    libvlc_media_player_is_playing = nullptr;
...
public:
    Foo()
    {
        libvlc_media_player_is_playing = (vlc_media_player_is_playing*)GetSomeAddress("SomeFuncName");
    }

    void call()
    {
        // but this is not `int`
        int result = libvlc_media_player_is_playing(player_ptr);
    }
}

1 个答案:

答案 0 :(得分:2)

vlc_media_player_is_playing是指向函数的指针的别名,该函数返回一个整数并获取指向libvlc_media_player_t struct的指针。

因此,对此类型的任何使用都被视为指向函数的指针,例如:

vlc_media_player_is_playing myFunc = SomeFuncReturningIntTakingVlc;

通过指针调用函数,例如:

int ret = (*myFunc)(libvlc_media_player_tParam);

但是你在这里创建了一个指向函数指针的指针:

 vlc_media_player_is_playing* libvlc_media_player_is_playing = nullptr;

所以删除上面的指针运算符使它看起来像:

vlc_media_player_is_playing libvlc_media_player_is_playing = nullptr;

稍后在函数call中调用该函数:

int result = (*libvlc_media_player_is_playing)(player_ptr);