如何在C中的函数内共享struct?(我得到了警告:预期'struct <anonymous>**')

use*_*649 1 c pointers

我不明白为什么会这样.我可以调用read_png_file()和*数据(如果我设置了,我可以看到值设置).但是当我调用next函数时,那里没有数据,但它是类型(PNGDataPtr*)0x22ff24引用(PNGDataPtr)0x77c02850你能解释一下那里发生了什么以及它是如何正确的?我想传递结构并在函数之间共享它.

#include <stdio.h>
#include <stdlib.h>
#include <png.h>

typedef struct
{
    FILE *fp;
} PNGData, *PNGDataPtr;


void read_png_file(char* file_name, PNGData * data)
{
}

void write_png_file(char* file_name, PNGDataPtr * data)
{
}

void process_file(PNGDataPtr * data)
{
}

int main(int argc, char **argv)
{
    PNGData data;
    read_png_file(argv[1], &data);
    process_file(&data);
    write_png_file(argv[2], &data);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

功能'主':|
警告:从不兼容的指针类型
main.c 传递'process_file'的参数1 | 19 |注意:期望'struct**'但参数的类型为'struct PNGData*'|
警告:从不兼容的指针类型[默认启用] |传递'write_png_file'的参数2
15 |注意:预期'struct**'但参数的类型为'struct PNGData*'|

Mar*_*ark 5

在write_png_file和process_file的声明中删除*.您已经将PNGDataPtr声明为指针.保留当前的习语应该将声明更改为以下内容:

void write_png_file(char* file_name, PNGDataPtr data)
void process_file(PNGDataPtr data)
Run Code Online (Sandbox Code Playgroud)

我假设这是你实际系统的代码片段; 但在C语言中我们习惯性地避免typedef将某些东西标记为指向它的非Ptr对应物.还有一些例外,例如为您希望隐藏底层细节的其他人构建API和库.我建议对结构声明进行以下更改,使其更加惯用:

typedef struct png_data_t
{
    FILE *fp;
} PNGData;
Run Code Online (Sandbox Code Playgroud)

命名结构将为编译器提供更好的诊断和错误消息.以及对方法声明的以下更改:

void write_png_file(char* file_name, PNGData * data) { }
void process_file(PNGData * data) { }
Run Code Online (Sandbox Code Playgroud)

您的主要方法不需要修改.