我正在尝试将 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
分配内存如果*metadata
是 NULL
,这是它现在的初始值。
最后av_dict_free()
将释放您的字典使用的内存。
关于c - 从函数返回结构会导致内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27824113/