我陷入了 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[],令人惊讶的是一切都运行良好!这也意味着 AVFrameframes_video1[]
终于被 decode_packet
函数成功“接收”...“数组在很多方面都表现得像指针,以至于你会被淹没在其中指针到指针的沼泽。”,这就是他所说的。实际上,我仍然不太明白 C 指针(尤其是与数组关联时)在深层意义上是如何工作的......
最佳答案
在您的代码中,刚刚定义了 frames_video1[]
,但其值(指针)未显式初始化*。所以你不能取消引用它们 - 执行frames_video1[i]->pkt_size
。这导致 undefined behavior .
* 它们被隐式初始化为 NULL,尝试取消引用,但这仍然会导致 UD。
关于c - 指针数组作为 C 函数中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299208/