c - 指针数组作为 C 函数中的参数

标签 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);
    ...
}

我可以编译代码,但是当我执行它时,我遇到了由 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/

相关文章:

c - 为什么我们在将多维数组传递给函数时可以省略它的第一维

c - "decode"sin泰勒级数的近似值

c - 指针内存中的最后一个值不正确

c - STM32微 Controller 类型转换

如果在 opendir 之后未打印路径名,则在使用 closedir 时会转储核心

C:检查数组等价性的更有效方法?

c - 如何包含包装到新 dll 中的 dll 文件?

c - 如何使用 ifdef 检测英特尔的编译器 (ICC)?

c - 十六进制浮点常量

c - 将 Matlab 函数转换为 C 函数