我被卡在C数组指针中并将其作为参数传递给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);
...
}
引起的分段错误
如何在这种情况下传递参数?我发现在处理char * []和char **时特别是当它们用作函数参数时,我的手总是弄脏......
编辑新代码:(有效!)
frames_video1[i]->pkt_size
让我简要总结一下旧代码的主要问题:它与初始化没什么关系,主要问题是将指针作为参数传递,实际上是关于正确地传递参数:听到来自@SF。,我将参数从AVFrame * frames_video []更改为AVFrame frames_video [],并且令人失望的是一切都运行良好!这也意味着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);
...
}
终于成功地被接收了#34;通过AVFrame frames_video1[]
函数..."数组在很多方面表现为指针,以至于你在指针指向沼泽中被淹死了。"这就是他的意思说过。实际上,我仍然不太了解c指针(特别是与数组关联时)是如何工作的......
答案 0 :(得分:4)
在您的代码中,frames_video1[]
刚刚定义,但其值(指针)未明确初始化 * 。所以你不能取消引用它们 - 做frames_video1[i]->pkt_size
。这会产生undefined behavior。
*它们被隐式初始化为NULL,尝试取消引用仍会导致UD。
答案 1 :(得分:1)
你没有提供整个代码,但我相信你的问题是你正在向函数发送一个指针数组,但是你没有初始化那个数组。您可能正在传递一个NULL数组,然后尝试引用它们。
答案 2 :(得分:1)
如何在此上下文中传递参数?
你提供的代码很好,就目前而言。函数调用的参数与函数的参数一致(当然,你可以诱导你的编译器警告你不是这样的任何情况)。此外,如果将数组作为函数参数传递,则被调用函数将看到与调用者相同的元素值,如果它为该数组的任何元素设置不同的值,则调用者可以看到该效果。
我不确定为什么你确信分段错误来自评估表达式frames_video1[i]->pkt_size
,但也许你是通过调试器确定的。在这种情况下,只有两种可能的解释:
变量i
小于0或大于2,因此您尝试访问越界数组元素。检查循环边界,并特别注意 N 元素数组的最大索引是 N-1 ,而不是 N 。
frames_video1[i]
不是有效指针。它可能永远不会被设置为有效指针,或者它可能是指向动态内存的指针,因为它已被释放,或者其值可能已被破坏。当然,在其他答案和对它们的评论中讨论的初始化问题指出了可以行使这种替代方案的一种途径,但是由于你似乎打算将其视为可能的原因,我不会再次讨论这个问题。
总的来说,您只提供框架代码,而不是实际可以证明问题的工作示例。您将收到的答案必然受到限制。
答案 3 :(得分:0)
首先,所有指针必须先正确初始化才能取消引用。因此,要编写frames_video1[i]->pkt_size
,您必须以某种方式初始化frames_video1[i]
下的指针(使用malloc
或将地址存储到具有正确范围的现有结构AVFrame
)。
其次,在将数组传递给函数之后,您将丢失有关它的大小的信息,因此它必须作为参数与数组一起传递,例如:。
int decode_video(char *src_filename, AVFrame *frames_video[])
应更改为:
int decode_video(char *src_filename, AVFrame *frames_video[],
int frames_count)
frames_count
为您提供信息,您可以在多长时间内迭代其他frames_video
(例如,索引i = 3
已经过大,frames_video
不包含此类元素。因此,对于这些函数,您传递frames_count = 3
并从0
迭代到i < 3
。