如何在C中的函数内共享结构?(我收到警告:预期为';结构<;匿名>;**';)

如何在C中的函数内共享结构?(我收到警告:预期为';结构<;匿名>;**';),c,pointers,C,Pointers,我不明白为什么会这样。我可以调用read_png_file()并且*数据就在那里(如果我设置了值,我可以看到设置的值)。但当我调用下一个函数时,里面并没有数据,而是类型 (PNGDataPtr*)0x22ff24参考(PNGDataPtr)0x77c02850您能解释一下那里发生了什么以及如何纠正它吗?我想传递结构并在函数之间共享它 #include <stdio.h> #include <stdlib.h> #include <png.h> typedef

我不明白为什么会这样。我可以调用read_png_file()并且*数据就在那里(如果我设置了值,我可以看到设置的值)。但当我调用下一个函数时,里面并没有数据,而是类型 (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;
}
#包括
#包括
#包括
类型定义结构
{
文件*fp;
}PNGData,*PNGDataPtr;
无效读取png文件(字符*文件名,PNGData*数据)
{
}
无效写入png文件(字符*文件名,PNGDataPtr*数据)
{
}
作废进程_文件(PNGDataPtr*数据)
{
}
int main(int argc,字符**argv)
{
PNGData数据;
读取png文件(argv[1],&数据);
处理文件和数据;
写入png文件(argv[2],&数据);
返回0;
}
函数“main”:|
警告:从不兼容的指针类型传递“process_file”的参数1
main.c | 19 |注:应为“struct**”,但参数的类型为“struct PNGData*”|
警告:从不兼容的指针类型[默认启用]|
15 |注意:应为'struct**',但参数类型为'struct PNGData*'|


在write_png_文件和process_文件的声明中,删除*。您已经将PNGDataPtr声明为指针。保留当前习惯用法时,应将声明更改为以下内容:

void write_png_file(char* file_name, PNGDataPtr data)
void process_file(PNGDataPtr data)
我假设这是您实际系统的代码片段;但在C语言中,我们习惯性地避免纯粹为了将某个对象标记为指向其非Ptr对应对象的指针而使用
typedef
ing。也有例外,例如为其他人构建API和库,您希望隐藏底层细节。我建议对结构声明进行以下更改,使其更为惯用:

typedef struct png_data_t
{
    FILE *fp;
} PNGData;
命名结构将从编译器中提供更好的诊断和错误消息。以及对方法声明的以下更改:

void write_png_file(char* file_name, PNGData * data) { }
void process_file(PNGData * data) { }

您的main方法不需要修改。

在write_png_文件和process_文件的声明中删除*。您已经将PNGDataPtr声明为指针。保留当前习惯用法时,应将声明更改为以下内容:

void write_png_file(char* file_name, PNGDataPtr data)
void process_file(PNGDataPtr data)
我假设这是您实际系统的代码片段;但在C语言中,我们习惯性地避免纯粹为了将某个对象标记为指向其非Ptr对应对象的指针而使用
typedef
ing。也有例外,例如为其他人构建API和库,您希望隐藏底层细节。我建议对结构声明进行以下更改,使其更为惯用:

typedef struct png_data_t
{
    FILE *fp;
} PNGData;
命名结构将从编译器中提供更好的诊断和错误消息。以及对方法声明的以下更改:

void write_png_file(char* file_name, PNGData * data) { }
void process_file(PNGData * data) { }
您的主方法不需要修改。

此:

void read_png_file(char* file_name, PNGData * data);
获取指向
PNGData
struct的指针,但是

void write_png_file(char* file_name, PNGDataPtr * data);
获取指向
PNGData
struct的指针

不要把
PNGDataPtr
PNGData*
混在一起-它们是一样的,你会把自己弄糊涂

理想情况下,完全摆脱PNGDataPtr。如果你坚持这个想法,请始终使用
PNGDataPtr
,永远不要使用
PNGData*
。不要把它们混在一起。

这个:

void read_png_file(char* file_name, PNGData * data);
获取指向
PNGData
struct的指针,但是

void write_png_file(char* file_name, PNGDataPtr * data);
获取指向
PNGData
struct的指针

不要把
PNGDataPtr
PNGData*
混在一起-它们是一样的,你会把自己弄糊涂


理想情况下,完全摆脱PNGDataPtr。如果你坚持这个想法,请始终使用
PNGDataPtr
,永远不要使用
PNGData*
。别把它们混在一起。

天哪,我真瞎。我没有看到差异,即使我认为我仔细检查了它。我没发现我抄错了单词PNGDataPtr而不是PNGDataOMG,我真是瞎了眼。我没有看到差异,即使我认为我仔细检查了它。我没发现我抄错了单词PNGDataPtr而不是PNGDataThank。现在我明白为什么它被称为“匿名结构”。谢谢。现在我明白为什么它被称为“匿名结构”。