我陷入了C数组指针,并将其作为参数传递给C函数。这是涉及问题的代码:
char *src_filename1 = NULL;
AVFrame *frame = NULL;
AVFrame *frames_video1[3];
AVFrame *frames_video2[3];
int decode_packet(int *got_frame, int cached, AVFrame *frames_video[])
{
...
frames_video[video_frame_count] = frame; //video_frame_count is 2 at the moment
...
}
int main()
{
decode_video(src_filename1, frames_video1);
...
printf("frames_video1[i]->pkt_size: %d\n", frames_video1[i]->pkt_size);
...
}
int decode_video(char *src_filename, AVFrame *frames_video[])
{
...
decode_packet(&got_frame, 0, frames_video);
...
}
我可以编译代码,但是在执行代码时,遇到了由以下原因引起的分段错误:frames_video1[i]->pkt_size
如何在此上下文中传递参数?我发现在处理char * []和char **时,尤其是当将它们用作函数参数时,我的手总是很脏。
编辑新代码:(有效!)
char *src_filename1 = NULL;
AVFrame *frame = NULL;
AVFrame frames_video1[3];
AVFrame frames_video2[3];
int decode_packet(int *got_frame, int cached, AVFrame frames_video[])
{
...
AVFrame tmp;
tmp = *frame;
frames_video[video_frame_count] = tmp;
...
}
int main()
{
decode_video(src_filename1, frames_video1);
...
printf("frames_video1[i].pkt_size: %d\n", frames_video1[i].pkt_size);
...
}
int decode_video(char *src_filename, AVFrame frames_video[])
{
...
decode_packet(&got_frame, 0, frames_video);
...
}
让我简要地总结一下旧代码的主要问题:与初始化没有什么关系,主要问题是将指针数组作为参数传递,实际上是正确地完全传递参数:在听完@SF的建议之后。 ,我将参数从AVFrame * frames_video []更改为AVFrameframes_video [],令人惊讶的是一切正常!这也意味着功能AVFrame frames_video1[]
终于被成功“接收”了decode_packet
……“数组在很多方面都表现为指针,以至于您陷入指针对指针的沼泽中。”他就是这么说的。实际上,我仍然不太真正理解c指针(尤其是与数组关联的指针)是如何工作的……
在这种情况下,我该如何传递论点?
就目前而言,您提供的代码很好。函数调用的参数与函数的参数一致(当然,在某些情况下,您可能会诱使编译器警告您)。此外,如果将数组作为函数参数传递,则被调用函数将看到与调用方相同的元素值,并且如果为该数组的任何元素设置了不同的值,则该效果对调用方可见。
我不确定为什么您有信心细分错误是由评估表达式引起的frames_video1[i]->pkt_size
,但也许您是通过调试器确定的。在这种情况下,只有两种可能的解释:
变量i
小于0或大于2,因此您尝试访问越界数组元素。检查循环边界,并要特别注意,一个最大的指数ñ -元素数组是N-1 ,不ñ。
frames_video1[i]
不是有效的指针。它可能永远不会设置为有效的指针,或者它可能是指向动态内存的指针,此指针已被释放,或者其值可能已损坏。当然,在其他答案及其评论中讨论的初始化问题指出了可以采用这种替代方法的一种途径,但是由于您似乎不赞成将其作为可能的原因,因此我不再赘述。
总体而言,您只展示了框架代码,而不是一个可以实际演示问题的可行示例。您将收到的答案必然受到此限制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句