指向数组指针的指针

Pointer to pointer to an array

[这是一个常见的C/C++问题,不要看Gst和G类型]

我有一个指向包含 2 个项目的数组的指针:

GstElement *videoconvert, *audioconvert;

GstElement *convert_array[2];
convert_array[0] = videoconvert;
convert_array[1] = audioconvert;

其中会传入回调函数:

g_signal_connect(decodebin, "pad-added", G_CALLBACK(on_pad_added), convert_array);

在 "pad-added" 发出信号后,我的回调函数将接收此指针 (convert_array) 作为 gpointer 类型:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data);

在这个回调中,我需要从 gpointer 数据中提取我的 GstElements,这是我不成功的尝试:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
    GstElement videoelem = ((GstElement *)data)[0];
    GstElement audioelem = ((GstElement *)data)[1];
...
}

我该怎么做?

data 需要转换为 GstElement**,而不是 GstElement*。请记住,当您在以下行中使用它时,convert_array 衰减为 GstElement**,而不是 GstElement*

g_signal_connect(decodebin, "pad-added", G_CALLBACK(on_pad_added), convert_array);

因此,您需要使用:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
    GstElement* videoelem = ((GstElement **)data)[0];
    GstElement* audioelem = ((GstElement **)data)[1];
    ...
}
void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
  GstElement videoelem = ((GstElement *)data)[0];
  GstElement audioelem = ((GstElement *)data)[1];
  ...
}

如果您的 gpointer 实际上是与 GstElement 相同的类型** 那么函数中的 GstElements 应该是指针类型:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
  GstElement* videoelem = ((GstElement **)data)[0];
  GstElement* audioelem = ((GstElement **)data)[1];
...
}