c - 从函数返回结构会导致内存损坏

标签 c ffmpeg

我正在尝试将 FFmpeg AVDictionary 结构从一个函数返回到另一个函数。我写了以下两个函数:

int get_p_metadata(State **ps, AVDictionary *metadata) {
    printf("get_p_metadata\n");

    State *state = *ps;

    if (!state || !state->pFormatCtx) {
        return FAILURE;
    }

    metadata = NULL;
    av_dict_copy(&metadata, state->pFormatCtx->metadata, 0);

    printf("count in get_p_metadata %d\n", metadata->count);

    return SUCCESS;
}

int get_metadata(State **ps) {
    printf("get_metadata\n");

    AVDictionary m;
    get_p_metadata(ps, &m);
    printf("count in get_metadata %d\n", (&m)->count);

    return SUCCESS;
}

代码编译并运行,但是当我调用 get_metadata 函数时,生成的输出是:

count in get_p_metadata 12
count in get_metadata 2073109240

有人可以解释为什么每次我运行此代码时 count 的值都会从 12 更改为随机值吗?为什么 get_p_metadata 函数返回后不保留 12 的值?我该如何解决这个问题?

更新:

这个解决方案有效(感谢 Cornstalks 实际阅读了 FFmpeg 文档并 linkdd 的答案):

int get_p_metadata (State **ps, AVDictionary **metadata) {
    printf("get_p_metadata\n");

    State *state = *ps;

    if (!state || !state->pFormatCtx) {
        return FAILURE;
    }

    av_dict_copy(metadata, state->pFormatCtx->metadata, 0);

    return SUCCESS;
}

int get_metadata(State **ps, AVDictionary *metadata) {
    printf("get_metadata\n");

    AVDictionary *m = NULL;
    get_p_metadata (ps, &m);
    printf("count in get_metadata %d\n", m->count);

    return SUCCESS;
}

最佳答案

实际上,在你的 get_p_metadata() 中你有一个争论AVDictionary *metadata .

你可以将其视为 get_p_metadata() 中的局部变量。 所以,&metadata将引用局部变量,而不是你的 m变量 get_metadata() .

get_p_metadata()开头, metadata设置为地址m ,然后将其重置为 NULL。

您应该尝试以下操作:

int get_metadata (State **ps)
{
    AVDictionary *m = NULL;
    get_p_metadata (ps, &m);
    av_dict_free (&m);
    return SUCCESS;
}

int get_p_metadata (State **ps, AVDictionary **metadata)
{
    /* ... */

    av_dict_copy (metadata, state->pFormatCtx->metadata, 0);

    /* ... */
}

这边,av_dict_copy()将为您的 AVDictionary 分配内存如果*metadataNULL ,这是它现在的初始值。

最后av_dict_free()将释放您的字典使用的内存。

关于c - 从函数返回结构会导致内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27824113/

相关文章:

c - 如何在 gdb 中查看 printf 的输出?

c++ - 为什么我的应用程序无法解码 RTSP 流?

FFMPEG 将两个命令合二为一

python - 运行 ffmpeg 时 Popen.communicate() 仅返回 err

c - 链表的问题)

c - TinyMT 示例初始化、使用

c - 在C中,我想在两个单独的进程中访问一个数组

c - 在 free() 之前赋值

c - 如何在不使用命令行的情况下在 GPU 上执行 ffmpeg 代码?

Youtube 处理停留在 95%